2016-12-27 103 views
0

我正在導入一個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變量。這些複選框的名稱被命名爲諸如WPFCheckbox0WPFCheckbox1,WPFCheckbox2等等。這些對象有兩個屬性,我計劃使用「命令」來存儲$SoftwareList[$i].path和「內容」來存儲$SoftwareList[$i].Name

我想不到一種方法來正確循環這些變量並將屬性從CSV分配給各自的WPFCheckboxes上的屬性。

任何建議將不勝感激。

+1

像「WPFCheckbox0」,「WPFCheckbox1」等名稱存在[XY問題]的嚴重氣味(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) - 您如何知道CSV中每行都有足夠的複選框?你也應該動態創建/生成複選框 –

回答

0

調用表達式是一種方式,儘管注意到Mathias關於整體方法的評論。

在您的foreach循環,你可以這樣做:

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

背打勾`之前的$ WPFCheckBox防止這將是被立即計算未定義的變量(調用表達式之前) ,但是我是。這會爲您提供一個字符串,其中包含您的$ 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 

作爲一個方面說明(因爲我不能在你原來的問題,尚未置評)創建一個數組只是通過充當迭代器該文件的行真的效率低下。確實有更好的方法來做到這一點。