So-net無料ブログ作成
QLOOKアクセス解析

ISE か PowerGUI か [PowerShell]

PowerShell のスクリプト作成時の環境として ISE(Integrated Scripting Environment) を使うか、PowerGUI を使うかを迷っています。

ISE と PowerGUI を比較すると後者の方がスクリプトエディターは使いやすいように思います。
ISE では
  • タブキーによる字下げが空白文字で行われる
  • タブ文字による字下げ幅がフォントによっては、ずれる場合がある。たとえば MS ゴシックの場合3文字分の幅になってしまう。
などの点が気に入りません。設定の余地があるのかもしれませんが、わかっていません。また、以前書いたように日本語入力のON/OFFの切り替えが少しうまくいかない問題もあります。(これは将来は修正されるものと期待していますが)
逆にデバッグ実行環境については ISE の方が素直なようです。
PowerGUI では
& { $myInvocation }
を実行すると、次のようになり ScriptName のところに実行しているスクリプトファイルの情報が入りません。
MyCommand         :  $myInvocation
BoundParameters : {}
UnboundArguments : {}
ScriptLineNumber : 2
OffsetInLine : 2
ScriptName :
Line : & { $myInvocation }
PositionMessage :
                     At line:2 char:2
                   + & <<<< { $myInvocation }
InvocationName : &
PipelineLength : 1
PipelinePosition : 1
ExpectingInput : False
CommandOrigin : Internal
ISEなら
MyCommand        :  $myInvocation
BoundParameters : {}
UnboundArguments : {}
ScriptLineNumber : 1
OffsetInLine : 2
ScriptName : D:\test\test1.ps1
Line : & { $myInvocation }
PositionMessage :
                     At D:\test\test1.ps1:1 char:2
                     + & <<<< { $myInvocation }
InvocationName : &
PipelineLength : 1
PipelinePosition : 1
ExpectingInput : False
CommandOrigin : Internal
のように入っています。
これだけであれば、なんとか回避することもできるのかもしれませんが、こういうレベルで環境が違うとなると、なんとなく気持ちが悪いような。。。

使い慣れたテキストエディター+コンソールにするのがいいのでしょうかね。

PowerShell の連想配列のコピー [PowerShell]

PowerShell の配列変数や連想配列変数のコピーは実体への参照がコピーされるだけなのを忘れないようにしよう。
簡単な確認。次のように連想配列を作って値を入れてからコピーして、
$hashtable1 = @{}
$hashtable2 = @{}

$hashtable1["key1"] = 101
$hashtable1["key2"] = 102

$hashtable2 = $hashtable1
コピーしたほうに別の値を代入すると、
$hashtable2["key1"] = 201
$hashtable2["key3"] = 203
元のhashtabele1の値もかわります。
http://msdn.microsoft.com/en-us/library/system.collections.hashtable.clone(VS.85).aspx
を見ると .NET Framework のハッシュテーブルの Clone メソッドもシャロウコピーと明記されているので、代入はこのメソッドが呼ばれているのかな?
ディープコピーしたい場合にはどうすればいいのだろう。
GetEnumerator メソッドを使って再帰的に全部コピーするように書くのがいいのでしょうか。一段だけなら次のように割と単純に書けますが、
foreach ($item in $hashtable1.GetEnumerator())
{
     $hashtable3[$item.Key] = $item.Value
}
連想配列の要素がさらに連想配列なら再帰的にする必要あるのでちょっと面倒?。


メッセージを送る
人気ブログランキングへ
 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は1年以上新しい記事の更新がないブログに表示されております。