2016-12-27 8 views
0

"Name"と "Path"の2つのレコードでCSVファイルをインポートしています。私がやろうとしています何Powershell - 変数を動的に反復する

$softwareList = Import-Csv C:\Scripts\NEW_INSTALLER\softwareList.csv 
$count = 0..($softwareList.count -1) 
foreach($i in $count){ 
    Write-Host $softwareList[$i].Name,$softwareList[$i].Path 
} 

$i変数に基づいてWPFCheckbox変数に各レコードの名前とパスを動的に割り当てるです。これらのチェックボックスの名前は、WPFCheckbox0WPFCheckbox1WPFCheckbox2などとなります。これらのオブジェクトには、私が使用する予定の2つのプロパティがあります。 "Command"を格納するための "Command"と、格納する "Content" $SoftwareList[$i].Name

これらの変数を適切にループし、それぞれのWPFCチェックボックスのプロパティを表示します。

ご意見をいただければ幸いです。

+1

[WPFCheckbox0]、[WPFCheckbox1]などの名前は、[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)の重い匂いがあります。 CSVの各行に十分なチェックボックスがあることをどのように知っていますか?チェックボックスを動的に作成/生成するべきでしょう –

答えて

0

Invoke-Expressionは片道ですが、Mathias氏は全体的なアプローチについて懸念しています。あなたのforeachループ内

、あなたのような何かを行うことができます:

invoke-expression "`$WPFCheckbox$i`.Command = $($SoftwareList[$i].Path)" 
invoke-expression "`$WPFCheckbox$i`.Content= $($SoftwareList[$i].Name)" 

$ WPFCheckBoxはすぐに評価されているから、未定義の変数であるもの防止直前にバックティック( `式が呼び出される前)しかし、私は$ Iです。 $ WPFCheckbox1の文字列が表示され、プロパティ名と値が追加されます。 $ SoftwareListの値は即座に生の文字列に処理されます。

Invoke-Expressionは、文字列全体を評価し、通常の文であるかのように実行します。ちょうどを通じてイテレータとして機能する配列を作成(、私はあなたの元の質問にはまだコメントすることはできませんので)注意点として

1..3 |% { 
    invoke-expression "`$MyVariable$_` = New-Object PSObject" 
    invoke-expression "`$MyVariable$_` | add-member -NotePropertyName Command -NotePropertyValue [String]::Empty" 
    invoke-expression "`$MyVariable$_`.Command = 'Path #$_'" 
} 

$MyVariable1 | Out-String 
$MyVariable2 | Out-String 
$MyVariable3 | Out-String 

:ここ

はと遊ぶのが、スタンドアローンのコードスニペットですファイルの行は実際には非効率的です。間違いなくもっと良い方法があります。

関連する問題