プロが教えるわが家の防犯対策術!

Add-Type -Assembly System.Windows.Forms
$CountParam = $args.Length

$enCtlvmxFile = @()
$dupCtlvmxFile = @()
$notCtlvmxFile = @()

for($i = 1; $i -lt $CountParam; $i++){
$matchVM = ($VM -cmatch $args[$i])
if(1 -gt $matchVM.Length){
$notCtlvmxFile += $args[$i]
}elseif(1 -lt $matchVM.Length){
$dupCtlvmxFile += $matchVM
}else{
$enCtlvmxFile += $matchVM
}
}

参考URL
http://qiita.com/ine1127/items/8a01cbf4558733afc …

A 回答 (2件)

PowerShell で空配列を宣言する意味はあるのか? って質問じゃなくて参考 URL に書いてあるスクリプトを解説してほしいっていう質問だったんですか。


ブログの投稿者が目的を持って書いたコードなのだから、質問者が得たいと思っている事のベストな解決方法は投稿者に聞くことだと思うのですがね。。。

「引数の数が一致」とか関係ない。
実行者は処理対象としたいバーチャルマシンのファイル名 (の一部) をスクリプトの引数で指定する。(複数可能)
この引数は $args という配列に自動的に格納されている。

$VM PC に保存されているであろうバーチャルマシンのファイル名が格納される。
複数のバーチャルマシンが存在することを想定しているので配列になっている。

実行者が指定したマシン名に合致するバーチャルマシンがこの PC に存在するのかを確認するための処理が for のブロックで行われている。
確認結果は 3つのパターンに振り分けられ、それぞれ配列の変数に結果が格納される。

1) $notCtlvmxFile は 「そんなマシン名のバーチャルマシンは存在しません」というパターン。
このパターンの場合、$notCtlvmxFile には実行者が指定した引数の文字列が配列で格納される。

2) $dupCtlvmxFile は 「引数で指定した文字列だと複数のバーチャルマシンが該当してしまうので、処理対象のマシンを絞り込めません」というパターン。
このバターンの場合、$dupCtlvmxFile にはバーチャルマシンのファイル名が配列で格納される。"hoge.vmx" とか。

3) $enCtlvmxFile は引数で指定した文字列で特定できたバーチャルマシンのファイル名が格納される。"hoge.vmx" とか。
これが処理としては正解のパターン。
最終的には $enCtlvmxFile 配列をループして 1台ずつバーチャルマシンを処理していく。

--------
たとえば $VM = ("FileSrv01.vmx", "DNS01.vmx", "DNS02.vmx", "DHCP01.vmx", "WINS01.vmx") だったとして、
$args が "Wins", "DNS", "DHCP", "WinSrv01" だったとする。

$matchVM = ($VM -cmatch $args[0]) は ($VM -cmatch "Wins") となるので $matchVM は空になり、その Length は 0 となる。
なので if(1 -gt $matchVM.Length) は true となるので $notCtlvmxFile に $args[$0] つまり "Wins" が配列の新たな要素として加わる。

$matchVM = ($VM -cmatch $args[1]) は $matchVM = ($VM -cmatch "DNS") なので $matchVM には "DNS01.vmx" と "DNS02.vmx" の2つが配列として格納され、その Length は 2となる。
なので if(1 -gt $matchVM.Length) は false だが、elseif(1 -lt $matchVM.Length) は true になるので $dupCtlvmxFile に "DNS01.vmx" と "DNS02.vmx" が配列の新たな要素として加わる。

$matchVM = ($VM -cmatch $args[2]) は $matchVM = ($VM -cmatch "DHCP") なので $matchVM には "DHCP01.vmx" が格納され、その Length は 1となる。
なので if(1 -gt $matchVM.Length) も false だし elseif(1 -lt $matchVM.Length) も false なので $enCtlvmxFile には "DHCP01.vmx" が配列の新たな要素として加わる。

$matchVM = ($VM -cmatch $args[3]) は $matchVM = ($VM -cmatch "WinSrv01") なので $matchVM は空で、その Length も 0 になる。
if(1 -gt $matchVM.Length) が true なので $notCtlvmxFile の配列要素に新たに "WinSrv01" が加わる。

結果、
$notCtlvmxFile は "Wins", "WinSrv01" の 2要素。
$dupCtlvmxFile は "DNS01.vmx", "DNS02.vmx" の 2要素。
$enCtlvmxFile は "DHCP01.vmx" だけ。
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。
$matchVM = ($VM -cmatch $args[$i])
if(1 -gt $matchVM.Length){
$notCtlvmxFile += $args[$i]
}
vmx名前の一致の有無で、文字列の長さで条件分岐し、一致した場合、配列要素に加算されるという事が分かりました。
例えも踏まえて下さりありがとうございます。

お礼日時:2016/06/10 02:24

このスクリプトの目的や作者のイズムはよくわかりませんが、


とりあえず要素なしの配列から始めて、条件に合えば要素を加えていきたかったんでしょ?
ループの結果、$enCtlvmxFile $dupCtlvmxFile $notCtlvmxFile の 3つの中には要素が一つもない配列も出てくることもあろうかと。(その場合は [0] が null なのか?)
そういう結果の出方のほうが後の処理で使いやすいとか。。。

よくわからんよ、記事の作者に質問しとくれよ。
    • good
    • 0
この回答へのお礼

ご返信ありがとうございます。
for文にてカウントアップしていき、引数の数が一致した場合、
$matchVM = ($VM -cmatch $args[$i])

左辺(配列)と右辺(数字[要素])配列末尾に代入し、右辺(数字[要素])に追記しているのでしょうか。
$notCtlvmxFile += $args[$i]
$dupCtlvmxFile += $matchVM
$enCtlvmxFile += $matchVM

考え方があっているのでしょうか。

お礼日時:2016/06/09 00:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!