Powershell跳过数组中的元素(如果为空)

Powershell跳过数组中的元素(如果为空),powershell,jenkins,conditional-statements,Powershell,Jenkins,Conditional Statements,我有一个powershell脚本,其中我从Jenkins接收元素名称作为变量: $IISarray = @("$ENV:Cashier_NAME", "$ENV:Terminal_NAME", "$ENV:Content_Manager_NAME", "$ENV:Kiosk_BO_NAME") foreach ($string in $IISarray){ "some code goes here" } 有时,随机元素可以是空白的。如何添加检查以查看数组中的当前元素是否为空,跳过它并转到下一

我有一个powershell脚本,其中我从Jenkins接收元素名称作为变量:

$IISarray = @("$ENV:Cashier_NAME", "$ENV:Terminal_NAME", "$ENV:Content_Manager_NAME", "$ENV:Kiosk_BO_NAME")

foreach ($string in $IISarray){
"some code goes here"
}

有时,随机元素可以是空白的。如何添加检查以查看数组中的当前元素是否为空,跳过它并转到下一个元素?

使用
-ne'
最简单的方法是创建一个过滤后的数组副本,该副本不包含空条目,这得益于许多PowerShell操作符可以充当具有数组值LHS的过滤器

注意:我假设您的意思是过滤掉空字符串,而不是空字符串(全部空白),因为未定义的环境变量会扩展为空字符串

上述收益率:

foo
bar
baz

提供了一个
Where Object
解决方案,该解决方案通过指定任意筛选脚本块的能力,潜在地提供了额外的灵活性,但是对于这种用例来说,使用管道有点麻烦。
幸运的是,PSv4+提供了
.Where()
收集方法,该方法的性能明显更好

让我用一个也排除空白(所有空白)元素的解决方案来演示它:

#注意all whitespace元素,我们也希望忽略它。
PS>(“foo”,“”,“bar”,“baz”,“”)。其中({$\u.Trim()})
福
酒吧
巴兹
Where-Object
cmdlet类似,您将脚本块传递给
.Where()
方法,其中自动
$\uu
变量表示当前的输入元素

.Trim()
方法修剪字符串的前导和尾随空格并返回结果。
因此,全空白字符串将导致空字符串

在布尔上下文中(如
.Where()
方法脚本块隐式表示),空字符串的计算结果为
$false
,而任何非空字符串的计算结果为
$true

但是,您可以选择显式(
$\u0.Trim()-ne“”
),甚至可以使用.NET方法(
[string]::IsNullOrWhiteSpace($\u0)
)。

您可以使用它来过滤空值或空值。它非常常用,所以
Where Object
的缩写

$IISarray = @("$ENV:Cashier_NAME", "$ENV:Terminal_NAME", "$ENV:Content_Manager_NAME", "$ENV:Kiosk_BO_NAME")

foreach ($string in ($IISarray | ? {$_})){
"some code goes here"
}

$是一个表示管道中每个传入对象的自动变量。
$null
和空字符串
'
在Powershell中都是错误的,因此只有长度大于0的非null值才会传递到for循环中。

这如何?如果($VariableName-eq$null){Write Host“变量为null”}
$IISarray |其中Object{$}Foreach Object{…
# you can skip the `@` and brackets as well as the quotation marks
$IISarray = $ENV:Cashier_NAME, $ENV:Terminal_NAME, $ENV:Content_Manager_NAME, $ENV:Kiosk_BO_NAME

foreach($String in $IISarray) {
    # trim the strings and check the length
    if($String.Trim().Length -gt 0) {
        "some code goes here"
    }
}
$IISarray = @("$ENV:Cashier_NAME", "$ENV:Terminal_NAME", "$ENV:Content_Manager_NAME", "$ENV:Kiosk_BO_NAME")

foreach ($string in ($IISarray | ? {$_})){
"some code goes here"
}