类似以下内容的PowerShell语法:?操作人员

类似以下内容的PowerShell语法:?操作人员,powershell,ternary-operator,null-coalescing-operator,Powershell,Ternary Operator,Null Coalescing Operator,我正在做一件事,分离一个XML文档并将某些元素的文本内容写入一个文件。加载XML文档后,基本方法非常简单:我所做的就是 $DI_XMLResponse.result.gudid.device.versionModelNumber | Out File-FilePath$OutputFile-Append-NoClobber-Encoding ascii 但是我需要安排在叶子元素没有内容或者根本不存在的情况下发出一个空行 我可以将内容分配给一个变量,测试变量是否为null,如果是,则将其设置为空字

我正在做一件事,分离一个XML文档并将某些元素的文本内容写入一个文件。加载XML文档后,基本方法非常简单:我所做的就是

$DI_XMLResponse.result.gudid.device.versionModelNumber | Out File-FilePath$OutputFile-Append-NoClobber-Encoding ascii

但是我需要安排在叶子元素没有内容或者根本不存在的情况下发出一个空行

我可以将内容分配给一个变量,测试变量是否为null,如果是,则将其设置为空字符串,然后将其写入文件

$foo=$DI_XMLResponse.result.gudid.device.versionModelNumber 如果$foo$foo= $foo | Out File-FilePath$OutputFile-Append-NoClobber-Encoding ascii


但我希望能找到更简洁的表达方式。有吗?

这是我的目标,我正在添加一个小型cmdlet


这是我的目标,我正在添加一个小型cmdlet


赋值可以作为表达式计算。这对你来说意味着,如果你所关心的只是简洁而不是可读性,你可以改变你所做的事情:

if (-not ($foo = $xml. ...)) {
    $foo = ''
}

赋值可以作为表达式计算。这对你来说意味着,如果你所关心的只是简洁而不是可读性,你可以改变你所做的事情:

if (-not ($foo = $xml. ...)) {
    $foo = ''
}
不幸的是,PowerShell没有一个。, 条件如果为真值:否则值或a,例如。, 可能的空值??自PowerShell Core 6.1.0起的valueIfNull

但是,需要加强语言来支持这些。 如果你想看到这种情况发生,就让别人听到你的声音——即使是简单的竖起大拇指也有帮助

在您的特定情况下,您正在寻找空合并运算符,并且存在-次优-解决方法:

定义自定义函数,如中所示,用于三元运算符

对于空合并运算符,它可能类似于:

function ?? ($PossiblyNull, $ValueIfNull) { 
  if ($null -eq $PossiblyNull) { $ValueIfNull } else { $PossiblyNull }
}
应用于您的代码:

?? $DI_XMLResponse.result.gudid.device.versionModelNumber '' |
  Out-File -FilePath $OutputFile -Append -NoClobber -Encoding ascii 
自定义函数的缺点是:

您需要在每段代码中包含或导入它们

如果选择熟悉的名称,如?:和??,则操作数的位置可能会令人困惑,因为在PowerShell中必须始终以不同的方式放置它们,因为实现是一个函数,例如。, A.C中的b与$a$b在PowerShell中

使用具有隐式布尔到整数转换的辅助数组:

$foo是一个数组,包含要输出的两个可能值。 $null-如果$foo为$null,则等式$foo是计算为$False的条件,否则为$False 请注意,$null是故意放在LHS上的,因为在RHS上,如果$foo恰好是数组值,它将执行不同的测试。 在数组索引的上下文中,需要[int]值,因此$True会自动转换为1,而$False会导致0。 最终结果是,如果$foo为$null,则为输出;否则,$foo按原样使用。 这种方法的缺点是:

不采用短路逻辑;i、 例如,在选择合适的元素之前,两个数组元素都会被无条件地求值

如果只需要null合并,那么必须首先将要测试的$null值存储在变量中;e、 例如,模仿 得到食物吧??'没有 必须首先将Get Foo Bar的输出保存在辅助变量中,以便可以写入: Get$Foo Bar$aux,'无'[$null-eq$aux]

不幸的是,PowerShell没有一个。, 条件如果为真值:否则值或a,例如。, 可能的空值??自PowerShell Core 6.1.0起的valueIfNull

但是,需要加强语言来支持这些。 如果你想看到这种情况发生,就让别人听到你的声音——即使是简单的竖起大拇指也有帮助

在您的特定情况下,您正在寻找空合并运算符,并且存在-次优-解决方法:

定义自定义函数,如中所示,用于三元运算符

对于空合并运算符,它可能类似于:

function ?? ($PossiblyNull, $ValueIfNull) { 
  if ($null -eq $PossiblyNull) { $ValueIfNull } else { $PossiblyNull }
}
应用于您的代码:

?? $DI_XMLResponse.result.gudid.device.versionModelNumber '' |
  Out-File -FilePath $OutputFile -Append -NoClobber -Encoding ascii 
自定义函数的缺点是:

您需要在每段代码中包含或导入它们

如果选择熟悉的名称,如?:和??,则操作数的位置可能会令人困惑,因为在PowerShell中必须始终以不同的方式放置它们,因为实现是一个函数,例如。, A.C中的b与$a$b在PowerShell中

使用具有隐式布尔到整数转换的辅助数组:

$foo是一个数组,包含要输出的两个可能值。 $null-如果$foo为$null,则等式$foo是计算为$False的条件,否则为$False 请注意,$null是故意放在LHS上的,因为在RHS上,如果$foo恰好是数组值,它将执行不同的测试。 在数组索引的上下文中,需要[int]值,因此$True会自动转换为1,而$False会导致0。 最终结果是,如果$foo为$null,则为outpu T否则,$foo按原样使用。 这种方法的缺点是:

不采用短路逻辑;i、 例如,在选择合适的元素之前,两个数组元素都会被无条件地求值

如果只需要null合并,那么必须首先将要测试的$null值存储在变量中;e、 例如,模仿 得到食物吧??'没有 必须首先将Get Foo Bar的输出保存在辅助变量中,以便可以写入: Get$Foo Bar$aux,'无'[$null-eq$aux]