メモす

学びしことを忘れぬようメモす

エラーメッセージって分かりやすい?

落とし穴があったので、メモす。

Invoke-Command-ScriptBlock で実行している結果を変数に格納して、 return で返そうとした。 最初はうまくいっていたが、処理を増やしていったら途中で動かなくなった。エラーメッセージは以下の通り。

'op_Addition' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。

一読しただけではよく分からず、ぐぐってみることに。 合致する件数は少なかったが、参考になる記事があった。

【引用元】

https://qiita.com/SGTY/items/15e56a7efb4d079d5b67

なるほど、配列ではないのに連結しようとしたから怒られたっぽい。 調査開始。 GetType().BaseType で型の種類を調べた。 その結果、コマンドプロンプトのコマンドの実行結果は System.Array になるが、 PowerShellのコマンドレットの実行結果は System.Object になるようだ。 @() で包んであげることにした。

ちなみにコマンドにしてもコマンドレットにしても、表示される実行結果1行が配列の1要素として格納される。 コマンドの場合、空行も1要素になるので注意。 コマンドレットでは、1~2行目に表示されるカラム名のようなものは要素としてカウントされない。

以上。ありがたき幸せ。

日本語を含むPSスクリプトにご用心

起きたトラブルをメモす。

注釈などに日本語を含んだPowerShellスクリプト内が動かなかった。 スクリプトを見直しても問題なさそうだった。

最終的に原因が文字コードだったっぽい。 いろいろ調べた結果、PowerShellスクリプト文字コードの自動判別がないらしい。 しかもスクリプト実行時に文字コードを指定することもできぬらしい。 そして、日本語を正しく扱えるのはShift-JISかBOM付きのUnicodeとのこと。

日本語を扱う以上、常に文字コード問題がつきまとう気がしてならない。。。

以上。

私はどこ?

重要だと思うことをメモす。

仕事上よく使う&好きなコマンドレットに Invoke-Command がある。 これをゴリゴリに使用しているある日、リモートで実行中自分はどこにいるんだ?という疑問が生じた。 そこですかさず pwd したくなったが、おっとこれはPowerShellだった。 調べたところ、 Get-Locationpwd に相当するではないか!と分かった。 さっそく Get-Location をリモートで実行させ、 -ScriptBlockreturn で返させたところ、 ログインユーザーのDocumentsフォルダにいることが分かった。

絶対パスでやりくりすれば気にすることはないのだが、気になったら調べるの性分でして。

以上。

夏だ!文字化けだ!

お化け、ではなく文字化けに遭遇したのでメモす。

PowerShellスクリプト内で Out-File を使って、ファイル出力したのだが、 出力したファイルをエディタで開いたら、あらまぁ文字化け。。。

日頃出てくるのは大体UTF-8かShift-JISのどちらかだが、 出力されたファイルはなんとUTF-16! 調べたところ、PowerShellは通常内部でUTF-16を使用しているらしい。 なので、デフォルトでファイル出力しようとするとUTF-16で出力されるらしい。

入出力系ではなるべく -Encoding をつけようと思った次第。 ちなみに、 -Encoding default とすると、OSのデフォルト文字コードになるらしい。 よって日本語WindowsならANSI(Shift-JIS)ということになる。

以上。

魔法が解けるまで~iOS編~

DNSキャッシュの保持期間をメモす。

DNSレコード変更後、iOSアプリからサーバーに通信できなくなる事象が発生。 DNSキャッシュを疑うことに。調べた結果は以下の通り。

  • iOSとしてのDNSキャッシュは24時間保持されるらしい。
  • 24時間待たずにキャッシュをクリアするには、1度機内モードにするか、端末再起動が必要らしい。

Windowsも24時間だったな。OSはみな24時間で魔法が解けるみたい。

以上。

魔法が解けるまで~Windows編~

DNSキャッシュの保持期間をメモす。

近々DNSレコードの変更作業が予定されているので、情報収集中。 調べた結果、WindowsはOSの機能としてDNSキャッシュを保持している模様(DNSゾルバーキャッシュ)。 キャッシュの保持期間はデフォルトで24時間(1日)とのこと。

以上。

ローカル系、全員集合!

成果物をメモす。

きちんと管理できていることが望ましいが、現実問題きちんと管理できていない ということもあるだろう。

Windowsのローカルグループにどんなアカウントがいるか? あのアカウントはどのグループに所属しているのか? なんてことを知りたいときもあるだろう。

というかあったので、以下のスクリプトにて収集。

Get-WmiObject Win32_GroupUser |
    Select-Object GroupComponent, PartComponent |
        % {$Group=($_.GroupComponet.split(",")[1].replace("Name=", "")); $member=($_.PartComponent.split(",")[1].replace("Name=", "")); echo "$group, $member"}

【引用元】

https://qiita.com/yamazon/items/86eb70a91bf572189a0d

以上。ありがたき幸せ。