gpt4 book ai didi

powershell - 使用 if 语句检查变量是否为空返回错误

转载 作者:行者123 更新时间:2023-12-03 00:27:20 25 4
gpt4 key购买 nike

我有一个我创建的 powershell 脚本,如果它尚未导入,它会尝试导入一个模块。

Try {
Import-Module -Name 'ModuleName' -ErrorAction Stop -ErrorVariable ModFail
}
Catch {
Write-Error "Module failed to be loaded."
}

稍后在脚本中我试图检查模块是否无法导入但检查错误变量。对于未通过 errorvariable 参数设置的其他变量,我只需使用以下内容检查其是否为空。
If ($null -eq $var) {
Do stuff
}

但是使用我使用errorvariable设置的变量这样做是行不通的。
if ($null -ne $Modfail) {
Do stuff
}

当测试变量是否实际上为空时,上面的计算结果为真。这与我想要的相反。当我运行变量时,它确实为空并且正在运行
$modfail | Gm 

失败,因为它是空的。为什么会这样?如果我将变量设置在 errorvariable 参数之外或者没有设置它,它会返回正确的。即使它有空格,它应该在管道到 Get-Member 时返回正确的字符串?

最佳答案

  • -ErrorVariable common parameter , 像所有 -*Variable常用参数,将从相关流中收集的输出报告为 System.Collections.ArrayList 实例。
  • (除非调用存在语法问题),System.Collections.ArrayList始终创建并分配给指定的变量,即使没有对象输出到目标流;也就是说,在 -ErrorAction 的情况下,如果没有发生错误,则为空 System.Collections.ArrayList已创建 - 与 $null 不同.

  • 因此, if ($null -ne $Modfail) ...不是正确的测试,因为它总是会返回 $true (根据定义,任何对象都不是 $null ,无论其类型或内容如何)。

    相反,请使用 if ($Modfail.Count -gt 0) ...或者,更简单地说,依赖于一个空集合被隐式强制为 $false 的事实。 [1]: if ($Modfail) ...
    至于:

    $modfail | Get-Member fails because it is empty. Why is this happening?



    每当您通过管道发送集合时,都会对其进行枚举。
    枚举空数组不会枚举任何内容,在这种情况下 Get-Member (正确地)提示缺少输入。

    (如果数组不为空,您应该看到有关 System.Management.Automation.ErrorRecord 的信息,即存储在 $ModFail 中的元素的类型)。

    如果您想使用 Get-Member 检查集合本身, 使用 Get-Member -InputObject $Modfail - 你会看到它的类型是 System.Collections.ArrayList (作为一个非泛型集合,它的元素没有预先确定的类型)。

    [1] 请注意,单元素集合可能会被强制转换为 $false同样,取决于该单个元素的值;然而,由 -ErrorVariable 创建的集合, 其中包含 System.Management.Automation.ErrorRecord 非空的情况,这不是问题;有关背景信息,请参阅 this answer 的底部部分.

    关于powershell - 使用 if 语句检查变量是否为空返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59760581/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com