Powershell跳过数组中的元素(如果为空)
我有一个powershell脚本,其中我从Jenkins接收元素名称作为变量: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" } 有时,随机元素可以是空白的。如何添加检查以查看数组中的当前元素是否为空,跳过它并转到下一
$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"
}