Powershell Where-Object插入数组

时间:2014-04-29 11:42:05

标签: arrays powershell csv

我正在尝试构建一个Powershell脚本,可以过滤CSV文件中的信息。但是当我使用数组作为参数之一时,我遇到了问题。

当我导入CSV文件并手动输入时,此命令有效:

$data |
    where-object {
        (
            $_.PackageAffected -eq "BslEqipWebPkg" -or
            $_.PackageAffected -eq "BslIDealAdminPkg" -or
            $_.PackageAffected -eq "ALL"
        ) -and (
            $_.ENV -eq "PROD" -or $_.ENV -eq "ALL"
        )
    } |
    select-object -property 'major step id','minor step id','PackageAffected',ENV,detail |
    format-table -autosize  

我正在尝试使用数组构建$_.PackageAffected行。

到目前为止,这是代码(不起作用):

$packageList = "`$_.PackageAffected -eq `"" + $package[0] + "`" -or"
for ($element=1; $element -lt $package.count; $element++) {
    $packageList = $packageList + " `$_.PackageAffected -eq `"" + $package[$element] + "`" -or"
}
$packageList = $packageList + " `$_.PackageAffected -eq `"ALL`""

$data | 
    where-object{($packageList) -and ($_.ENV -eq $environment -or $_.ENV -eq "ALL")} |
    select-object -property 'major step id','minor step id','PackageAffected',ENV,detail |
    format-table -autosize
$packageList

在我放置$packageList的底部,它会在屏幕上显示我希望看到的字符串,即:

$_.PackageAffected -eq "pkgName1" -or $_.PackageAffected -eq "pkgName2" -or $_.PackageAffected -eq "ALL"

但是当我在运行表后查看该表时,PackageAffected上没有过滤器。

我的怀疑是我将命令转换为字符串,当它运行时,Powershell不会将其识别为命令。

1 个答案:

答案 0 :(得分:1)

您需要评估表达式。这可以使用Invoke-Expression来完成,例如

Invoke-Expression $packageList

在您的代码的上下文中,这将是:

$data | 
    where-object{(Invoke-Expression $packageList) -and ($_.ENV -eq $environment -or $_.ENV -eq "ALL")} |
    select-object -property 'major step id','minor step id','PackageAffected',ENV,detail |
    format-table -autosize