2016-12-27 161 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 

作为一个方面说明(因为我不能在你原来的问题,尚未置评)创建一个数组只是通过充当迭代器该文件的行真的效率低下。确实有更好的方法来做到这一点。