PowerShell -Part 3
■ このスレッドは過去ログ倉庫に格納されています
>>149
>Java のStream とか、C# のLinq みたいな感じ
まさにLinqの形なんですね。C#でLinq使ってみて、もしかして・・・と思って
テストしてみたい次第。
>>150
foreach速いのかな?
逆にすげー遅いんじゃないかと思ってだんたけど、どうなんだろう。
場合によると、それはforに対するforeachの話かもしれない。
ちょっとデータが大きくなると、利用していなかったけど、少しくらい大きい
ものなら、PowerShell結構使い物になることが分かったので、ツール作ろうかと
思って来ましたよ。コマンドレットを独自に作れば結構なことが出来そう。 >>149
>まさにLinqの形なんですね。C#でLinq使ってみて、もしかして・・・と思って
>テストしてみたい次第。
間違った
「テストしてみた次第」 遅延実行とパイプラインは違うよ
遅延実行はオンデマンドの処理で、並行処理になるか一括実行になるかは無関係
イメージとしてはプロキシ
パイプは次を待たずに通常バッファリングされながら並行処理されるもの
イメージはCPUの命令パイプラインそのもの >>151
確かここのサイト
http://tech.guitarrapc.com/entry/2013/03/09/010335
Powershell3.0での結果らしい
forとforeachとforeach-object(パイプライン使用)とかの比較
データサイズやら構造で違いはありそう
.foreach()メソッドでも動作は変わるらしい
foreachだけでコマンド、フィルター、メソッドと3種類あるとか自分にはついていけなかった >>153
わかってなかったわ
遅延実行やら並行処理やらの勉強やら検証方法やら勉強して出直さないとダメだなぁ >>154
あ〜、これは今回の参考にならないかも
わたしも、ずっと似たような考えをしていたんですよ。
このサイトの例では、一度変数に入れてから、別な処理を
行うという処理なので、遅延実行がされていないです。
私がやったのは、コマンドレットをまたいで遅延実行を
してくれているのだと気が付いてやってみたという例なので。 >>143
>>144
ありがとうございます。
動きました。
願わくば、タイトルバーのフォントも変えたかったのですが
おそらく無理ですよね。 Ruby では、Enumerator::Lazy で、無限リストを遅延処理できる
(1..Float::INFINITY).lazy.map{ |n| n*2 }.first(5)
# => [2, 4, 6, 8, 10]
これをLazyなしだと、先に無限配列を実体化しようとして、フリーズする
(1..Float::INFINITY).map{ |n| n*2 }.first(5)
# => (実行が終わらない...) >>158
Rubyの場合も、PowerShellのように、複数のモジュール(PowerShellの場合だとCmdletやスクリプト)をつなげば連動して遅延実行してくれるのでしょうか。
Rubyの方が遅延実行は先駆ということは書かれていたけど。
使うことはないけれども知識として。 Ruby では、内部イテレータのEnumerable と、外部イテレータのEnumerator がある
Enumeratorをメソッドチェーンしている間は、リストが実体化されないから、
Enumeratorで続けていって、最後に実体化する
内部イテレータは、イテレータ自身が繰り返し制御を行う。
一方、外部イテレータは、ユーザーが繰り返し制御を行う
外部イテレータでは、2つの配列を1つずつ進めたり、カスタマイズできる C#と同じような感じだね
今回はPowerShellで遅延実行すると同じく
実体化されずに次の処理に渡ることが分かったので
こんどはコマンドレットを作ってみようと思う。 19,000,000件、20項目のCSVをimpo-csvで読んで、
group-objectで8x8のクロス集計したら
どうも読んでいる途中でおかしくなったようだ。
原因を探らんと・・・・。
800万件では問題なかったんだが。 遅延実行と聞くとコマンドプロンプトのforが思い浮かぶね
しかし遅延実行じゃなくて困ったことはあるがその逆は無い
遅延実行じゃないほうって何かメリットあるの? 遅延実行もsetlocalのオプションで即時展開できるやん リモートデスクトップ接続元がわかる方法ないかな?
クライアントPC名、ログインユーザー名、ipを見たいんだけど…
調べたらPSTerminalServicesってモジュールで出来るらしい記事があったんだけどもうインストーラー配布してないみたいで手詰まりです。 >>167
https://powershelladministrator.com/2015/12/01/get-logged-on-users-and-sessions/
Get-RDUserSession |fl *
で拾えるとは思うから接続元プロパティ名わかったらselect-object UserName,(接続元のプロパティ名)
とかやってみて >>170
ありがとうございます!
早速使ってみたいと思います!
スレ汚しすいませんでした。 >>168
PowershellとWindowsサービス管理用コマンドレットは関係有りまくり たしかに
もともと、PowerShellが出てきた目的の世界だね >>174
Windows板にこのスレがない時点で意味ない FizzBuzz 42文字でかけた
1..100|%{"$_`r"+{fizz}[$_%3]+{buzz}[$_%5]} >>177
キャリッジリターンで上書きしてるだけなのでやや反則か
文字列長は(数字桁+1)文字されてる スクリプトブロックに[0]添字で値参照て技があるのか配列なら分かるけどなんか不思議 PowerShellは配列の扱いがかなり独特
単なる数値でも配列扱いすると要素1つだけの配列みたいに振舞う
$a = 1
$a[0] ⇒ 1
$a[1] ⇒ $null
まあ>>177はよく思いついたなって思う まず{fizz}が文字列になるという部分から読めなかった powershell -v 2だと動かないな
PowerShell 3.0で配列じゃない変数も要素を取得できるようになったから動く
バグではないっぽい 事務の仕事で、ファイル処理とかテキスト処理のため、たまにPowerShellを使ってます
挙動の予測ができずトライアンドエラーをする機会がVBAなどより少し多くて
素人にはちょっと難しいのかなあと思ってたのですが
理解不能な技>>177を見て、使いこなせる自信がますます無くなりました >>184
{abc}[0] #=>abc
これがわかんない
スクリプトブロックで囲むと、なんでabcはエラーにならないの?
普通にabcとやったらコマンドレットじゃないってエラー出るのに スクリプトブロックを文字列にキャストすると中身が実行されずに中のコードがそのまま文字列になる
つまり [string]{ fizz } が暗黙になされてるだけ その説明もピンと来ないが
&[fizz] や $hoge={Fizz};&$hoge
とすればちゃんとエラーになる。
未実行のスクリプトブロックは一種のヒア文字列扱いとなるということなんだろうか… powershell -v 2のエラーメッセージ
"型 System.Management.Automation.ScriptBlock のオブジェクトにインデックスを付けることはできません。"
わかるw { abc def ghi} #=> abc def ghi
なんか{}でかこまれた部分がそのまま文字列になってる
なにこれぇ 1..100|%{"$_`r"+{fizz}[$_%3]+{buzz}[$_%5]}
1..100 # 範囲演算子で1から100までのint[]を生成
| # パイプ演算子
% # Foreach-Object
{ # スクリプトブロック開始(%の引数)
" # 文字列開始(二重引用符の中ではエスケープシーケンスが展開される)
$_ # パイプラインの入力を受け取る自動変数
`r # Carriage returnのエスケープシーケンス。後に続く文字で前の文字を上書きする(なにもない場合上書き無し)
" # 文字列終了→string型
+ # 加算演算子(左辺がstring型なので右辺をstring型にキャストする)
{ # スクリプトブロック開始
fizz # コマンド/関数名fizzとして解釈されるがスクリプトブロック内なので実行されない
} # スクリプトブロック終了→ScriptBlock型
[ # []演算子で左辺を要素数1の配列としてアクセスする。
$_%3 # 配列のインデックス。%(剰余)演算子でパイプラインの入力$_を3で割る
] # 上の結果が0(→3の倍数)の場合のみスクリプトブロックの要素にアクセス、1以上の場合$null
+ # 加算演算子(左辺がstring型なので右辺をstring型にキャストする)。
{buzz}[$_%5] # fizzと同じ。結果としてstringが評価されコンソールに出力される
} #スクリプトブロック終了。 >>189
単にスクリプトブロック型のオブジェクトが中身の生コードを持ってるだけやろ
{fizz}.ToString() しても同じ
ToString()でどういう値を返すかはオブジェクトの種類によって違う
&やコンマやInvokeしたときに初めてスクリプトブロック型オブジェクトが持ってるコードが評価される ちょっと舌足らずだった
スクリプトブロック型はToString()したときに
内部に文字列としてもってる生コードを返すってことが言いたかった
実際ソースを読んでるわけじゃないけど スクリプトブロックは&で評価されるまで中身何もチェックされないみたいですね
一応動作は理解しましたがなんていい加減な言語なんだろ
こんなのどこにも書いてないし今後仕様変わる可能性はありそうですね
ありがとうございました こんなのは常識的に理解できる範囲や
パイプラインを考慮した関数をちゃんと作ろうと思ったら頭おかしなるで しかし、以前に比べて
投稿される内容が良くなってきたね
かつては『○○と比べてなんら』とか
そういう投稿ばかりだったもんね。 シェル芸ならこんなところ
seq 100|sed 's/.*5$/Buzz/;3~3s/[0-9]*/Fizz/' 知恵を絞って短縮コードを目指すから、理解容易ではないのはまあ仕方ない 3.0からの文法でできるならだれか思いついてそうだったけど検索しても出てこないな
Anarchy GolfにはPowerShell無いし、StackExchangeで58byte、牟田口氏のコードで51byte
いろいろテクニックが載ってて面白い
what is your fave PoSh version of FizzBuzz? : PowerShell
https://www.reddit.com/r/PowerShell/comments/6r06hg/what_is_your_fave_posh_version_of_fizzbuzz/
code golf - Tips for golfing in PowerShell - Programming Puzzles & Code Golf Stack Exchange
https://codegolf.stackexchange.com/questions/191/tips-for-golfing-in-powershell?page=2&tab=votes#tab-top ISEは問題ないのに、普通のシェルがダメって何年放置されてるのだろう? VSCodeでPowershellの色寂しくなった >>212
6.0はOKで6.1がだめと書かれてる
6.1が出たのは2か月前じゃないの >>208はデスクトップ版Powershellの話Win10が出て3年かな オプションを展開させるうまい方法ってありますか?
たとえば、-WhatIfを付ける/付けないを場合分けしたいときなど。
HogeCmd fuga piyo $whatif
とやると、$whatifは普通の引数になってしまうのでNG。
eval方式(コマンド全体を文字列にしてInvoke-Expressionで呼び出す)もあるけれど、
できれば、オプションのところだけうまいこと展開できればいいな、と。 >>216
横からだが、スプラッティングというものを初めて知って非常に参考になった。ありがとう。 >>221
よせよ
バケラッタを連呼する某アニメキャラを連想しちゃっただろ 実行ユーザーがSYSTEMな場合の
COMオブジェクト利用がうまくいかないのは回避策ないでしょうか 資格情報・認証とか?
「powershell 資格情報」で検索して >>225
excelとか使うとき普通に使えてるけど
何かうまくいことがあるの? >>229
普通の使い方してたらSYSTEMなんかで動かすことはないからサービスとかで動かしたいとかなんだろうと思う
いずれにせよ状況小出しにする奴の相手してもしょうがない タスクスケジューラで動かしたいのかも。いずれにせよ具体例を書いて欲しいものだ >>221
スプラッターハウス以外思い浮かばないw WindowsCompatibilityモジュール試してみたけどFormat-table用の情報とか無いから一部コマンドレットの表示が微妙
いちいちモジュール読み込まんとダメだし >>233
Fomat-Table、モジュールなしだと使えなかったの? >>234
いや、そこまでの問題じゃない
Format-Tableで優先表示するプロパティ情報がないだけ
Format-Tableしても要らんプロパティがでてきたりする
Select-objectとかしてあげれば問題ないよ 暗黙のWrite-Host|ft
が効かず、明示的に書かんどダメな感じ? Effective PowerShell的な本ってないの?
普段、使う分には問題なく使えてると思う
でもより上手い書き方があるのでは、良いコーディング習慣を守れてるだろうか、と自問自答すると自信を持てない
人に見せるものでもなく、人のを見る機会もないからどうしても自己流になってしまう 文法詳説はこの前出た貝殻本が扱ってたけど
読みにくい(演算子の説明が130ページくらいから始まる) バイナリモジュールの情報少ないよなあ
github漁ってもあんまりないし
コマンドレット内でGet-Item呼び出す方法探すだけでだいぶ苦労した
結局ダサいやり方になったけど powershell深いなあ。深すぎてちょっと目眩する時がある get-netadapterとか見たいに複数の結果を返すようなクラスが作りたいんだけど
どんな感じで書けばいいん?
思い浮かばねえorz >>243
Function内でWrite-outputでクラスを複数回出力するとか
クラスの配列を返せばいいよ >>244
ちと理解できてない
例えば、get-netadapterの内容を編集して結果をだすクラスを作るとして
インプットが複数なのでそれを都度かえしていくってことでいいのかな? >>245
まず作りたいのはクラスじゃなくてFunction(関数)かメソッドかコマンドレット(外部関数)だよね?
クラスは型であって入力と出力を持つものでは無いし
Get-netadapterも含めて一般的なコマンドレットの出力型は配列で
配列の各要素がクラスになってる
Get-netadapterの結果に編集を加える場合、
入力された値をforeach等で分解して
クラスにAdd-member等で要素(プロパティとか)を加えて毎回出力するとかする
もしくは配列の各要素がPSCustomObjectクラスの変数を作って
それを出力するとかする
サンプルに丁度よい関数とかあればいいけど一端探すのめんどいから割愛
Add-memberとかクラスのメンバーについてはググって調べて下さいな この手の話題でクラスとインスタンスの区別をせずに語られるとすごくモヤモヤする PSVersion 5.1.17763.134
PSEdition Desktop
で Windows.Forms.Timer がちゃんと動いてくれぬ
Tickイベント内の変数の変更を保持してくれない? 途中で切れてしまった
コンストラクタに引数設定できるでしょ
その引数にget-netadapterの結果みたいなのを使う
で、その値で各プロパティの初期値みたいなのをセット
各引数付きのメソッドを実行すると、引数とプロパティを処理した結果を返すんだけども
get-netadapterみたいに複数がコンストラクタのインプットになるから、どうしたもんかと
やっぱ、無理なのかな ■ このスレッドは過去ログ倉庫に格納されています