エラーメッセージって分かりやすい?
落とし穴があったので、メモす。
Invoke-Command の -ScriptBlock で実行している結果を変数に格納して、 return で返そうとした。
最初はうまくいっていたが、処理を増やしていったら途中で動かなくなった。エラーメッセージは以下の通り。
'op_Addition' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。
一読しただけではよく分からず、ぐぐってみることに。 合致する件数は少なかったが、参考になる記事があった。
【引用元】
なるほど、配列ではないのに連結しようとしたから怒られたっぽい。
調査開始。 GetType().BaseType で型の種類を調べた。
その結果、コマンドプロンプトのコマンドの実行結果は System.Array になるが、
PowerShellのコマンドレットの実行結果は System.Object になるようだ。
@() で包んであげることにした。
ちなみにコマンドにしてもコマンドレットにしても、表示される実行結果1行が配列の1要素として格納される。 コマンドの場合、空行も1要素になるので注意。 コマンドレットでは、1~2行目に表示されるカラム名のようなものは要素としてカウントされない。
以上。ありがたき幸せ。
私はどこ?
重要だと思うことをメモす。
仕事上よく使う&好きなコマンドレットに Invoke-Command がある。
これをゴリゴリに使用しているある日、リモートで実行中自分はどこにいるんだ?という疑問が生じた。
そこですかさず pwd したくなったが、おっとこれはPowerShellだった。
調べたところ、 Get-Location が pwd に相当するではないか!と分かった。
さっそく Get-Location をリモートで実行させ、 -ScriptBlock の return で返させたところ、
ログインユーザーのDocumentsフォルダにいることが分かった。
絶対パスでやりくりすれば気にすることはないのだが、気になったら調べるの性分でして。
以上。
夏だ!文字化けだ!
お化け、ではなく文字化けに遭遇したのでメモす。
PowerShellのスクリプト内で Out-File を使って、ファイル出力したのだが、
出力したファイルをエディタで開いたら、あらまぁ文字化け。。。
日頃出てくるのは大体UTF-8かShift-JISのどちらかだが、 出力されたファイルはなんとUTF-16! 調べたところ、PowerShellは通常内部でUTF-16を使用しているらしい。 なので、デフォルトでファイル出力しようとするとUTF-16で出力されるらしい。
入出力系ではなるべく -Encoding をつけようと思った次第。
ちなみに、 -Encoding default とすると、OSのデフォルト文字コードになるらしい。
よって日本語WindowsならANSI(Shift-JIS)ということになる。
以上。
ローカル系、全員集合!
成果物をメモす。
きちんと管理できていることが望ましいが、現実問題きちんと管理できていない ということもあるだろう。
Windowsのローカルグループにどんなアカウントがいるか? あのアカウントはどのグループに所属しているのか? なんてことを知りたいときもあるだろう。
というかあったので、以下のスクリプトにて収集。
Get-WmiObject Win32_GroupUser |
Select-Object GroupComponent, PartComponent |
% {$Group=($_.GroupComponet.split(",")[1].replace("Name=", "")); $member=($_.PartComponent.split(",")[1].replace("Name=", "")); echo "$group, $member"}
【引用元】
以上。ありがたき幸せ。