Powershell:如何确定“if”语句中哪个变量触发True?

时间:2016-03-03 15:09:31

标签: powershell if-statement

在powershell中,我的代码看起来像这样。如果用户不提供任何变量,那么目的是用数据填充少量变量:

if ($1 -eq $null){$1 = "N/A"}
if ($2 -eq $null){$2 = "N/A"}
if ($3 -eq $null){$3 = "N/A"}

是否有可能将这些内容压缩成这样的东西?

if ($1 -or $2 -or $3 -eq $null){
     $FILLER = "N/A"
}

其中$ FILLER是返回True的变量?

编辑:例如,如果$ 2为null但是$ 1和$ 3不是 - 那么代码将N / A分配给$ 2。

注意:我对单个if语句没有问题,我只是想压缩重复的代码。

3 个答案:

答案 0 :(得分:2)

您可以使用Get-Variable cmdlet。该cmdlet向您返回表示变量的PSVariable个对象。 PSVariable个对象具有Value属性,允许您获取和设置变量的值。这样,您可以过滤具有特定值($null)的变量,然后为它们分配新值。

Get-Variable 1, 2, 3 |
Where-Object { $null -eq $_.Value } |
ForEach-Object { $_.Value = 'N/A' }

答案 1 :(得分:1)

您可以使用!来定义-eq $ null或-eq $ false:

if (!$1 -or !$2 -or !$3){
     $FILLER = "N/A"
}

答案 2 :(得分:1)

你可以稍微改变一下顺序:

$1 = if (!$1) { "N/A" }

但是你真正要问的是,如何确定$true语句中返回if中的多个条件中的哪一个是不可能的。

如果要传递一组值并返回满足条件的值,请考虑Where-Object

$result = $1,$2,$3 | Where-Object { -not $_ }

如果条件是-match-like之类的字符串运算符,它实际上已经在数组上运行并返回一个数组:

$result = 'apple','apply','ape','zebra' -like 'app*'