
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 …
No.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" だけ。
ご返信ありがとうございます。
$matchVM = ($VM -cmatch $args[$i])
if(1 -gt $matchVM.Length){
$notCtlvmxFile += $args[$i]
}
vmx名前の一致の有無で、文字列の長さで条件分岐し、一致した場合、配列要素に加算されるという事が分かりました。
例えも踏まえて下さりありがとうございます。
No.1
- 回答日時:
このスクリプトの目的や作者のイズムはよくわかりませんが、
とりあえず要素なしの配列から始めて、条件に合えば要素を加えていきたかったんでしょ?
ループの結果、$enCtlvmxFile $dupCtlvmxFile $notCtlvmxFile の 3つの中には要素が一つもない配列も出てくることもあろうかと。(その場合は [0] が null なのか?)
そういう結果の出方のほうが後の処理で使いやすいとか。。。
よくわからんよ、記事の作者に質問しとくれよ。
ご返信ありがとうございます。
for文にてカウントアップしていき、引数の数が一致した場合、
$matchVM = ($VM -cmatch $args[$i])
左辺(配列)と右辺(数字[要素])配列末尾に代入し、右辺(数字[要素])に追記しているのでしょうか。
$notCtlvmxFile += $args[$i]
$dupCtlvmxFile += $matchVM
$enCtlvmxFile += $matchVM
考え方があっているのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- その他(プログラミング・Web制作) pythonをjupiter notebookからmecabで頻出の高い単語の抽出について(Runt 1 2022/12/17 18:08
- その他(プログラミング・Web制作) pythonリストの特定の値を表示htmlで表示できない 2 2022/05/14 05:48
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのautofilter、criteriaの配...
-
配列の重複削除について
-
クラスに配列を渡す方法
-
文字の整列(printf)
-
二次元配列のインデックスについて
-
エクセルVBAでTransposeの不思議
-
perlで2次元配列をサブルーチ...
-
HTML::Parserの解析結果
-
二次元配列における要素数のは...
-
perlで配列の要素が空なのを知...
-
バイナリデータの検索(VB.NET2008)
-
Strawberry Perl for Windows ...
-
リストボックスに縦スクロール...
-
画面を強制的に再描画させる方法
-
CSVファイルの特定の行だけを読...
-
VB2010でCSVファイルの読み込み
-
流れ図(フローチャート)が分か...
-
GIFアニメをループさせたくない
-
ハッシュ値が一致したデータは...
-
vb.netです。2次元配列の要素を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAでTransposeの不思議
-
VBAのautofilter、criteriaの配...
-
マクロ Publicでの配列定義
-
Excel VBA ユーザーフォームの...
-
チェックボックスのperlでの値...
-
リストボックスに縦スクロール...
-
Strawberry Perl for Windows ...
-
クラスに配列を渡す方法
-
二次元配列のインデックスについて
-
二次元配列における要素数のは...
-
文字の整列(printf)
-
Dim flag(4) as boolean で配列...
-
perl 配列の要素数について
-
複数の配列の全ての組み合わせ...
-
バイナリデータの検索(VB.NET2008)
-
perlで配列の要素が空なのを知...
-
可変長配列を、動的確保した固...
-
perl このテキストファイルを簡...
-
VBScript 配列
-
VB6で配列の最大値を簡単に求め...
おすすめ情報