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

时间:2018-11-13 17:05:32

标签: 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"
}

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

3 个答案:

答案 0 :(得分:3)

最简单的方法是使用-ne ''创建排除空条目的数组过滤副本,这要归功于许多PowerShell运算符可以充当过滤器带有数组值的LHS。

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

# Sample array with empty elements.
# Note: No need for @(...)
$IISarray = "foo", "", "bar", "baz", ""

# Note the `-ne ''`, which filters out empty elements.
foreach ($string in $IISarray -ne ''){
   $string # echo
}

以上结果:

foo
bar
baz

soundstripe's answer提供了一种Where-Object解决方案,它可以通过指定任意过滤器脚本块的功能来提供更大的灵活性,但是在此用例中,管道的使用有点繁琐。
幸运的是, PSv4 + 提供了 .Where()集合方法 ,效果明显更好。

让我用一种可以排除空白(全空白)元素的解决方案进行演示:

# Note the all-whitespace element, which we want to ignore too.
PS> ("foo", "   ", "bar", "baz", "").Where({ $_.Trim() })
foo
bar
baz

类似于Where-Object cmdlet,您将 script块传递给.Where()方法,其中自动$_变量表示输入元素,位于手。

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

在布尔上下文中(如.Where()方法脚本块隐式是),字符串的求值为$false,而任何非空字符串为{{1 }}。
您可以选择显式($true),甚至可以使用.NET方法($_.Trim() -ne '')。

答案 1 :(得分:2)

您可以使用Where-Object筛选出空值或空值。它非常常用,因此?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的非空值将被传递到您的for循环中。

答案 2 :(得分:1)

<img src="{{ site.baseurl }}/assets/Animation/run.gif">