在PowerShell中,如何测试特定变量是否存在于全局范围内?

Sco*_*nce 53 powershell

我正在使用PowerShell脚本来实现WPF应用程序的UI自动化.通常,脚本基于全局变量的值作为一组运行.当我想只运行一个脚本时,手动设置此变量有点不方便,所以我正在寻找一种方法来修改它们以检查此变量并在未找到时设置它.

test-path变量:\ foo似乎不起作用,因为我仍然收到以下错误:

无法检索变量'$ global:foo',因为它尚未设置.

ste*_*tej 194

Test-Path 可以使用特殊语法:

Test-Path variable:global:foo
Run Code Online (Sandbox Code Playgroud)

  • +1用于非常巧妙地使用变量PsProvider (9认同)
  • 我使用了这个概念,但在我的情况下,我必须测试变量:local:foo (5认同)
  • 如果变量不是全局变量,请确保不包含"全局"部分. (4认同)
  • 由于cmd.exe很无聊:)无需删除,因此可以获取所有可能的启发答案。 (2认同)
  • 有人介意提供此语法的文档吗? (2认同)

Joe*_*oey 24

编辑:使用下面的stej的答案.我自己(部分不正确)的一个仍然在这里复制以供参考:


您可以使用

Get-Variable foo -Scope Global
Run Code Online (Sandbox Code Playgroud)

并捕获变量不存在时引发的错误.

  • 您不必捕获错误.`Get-Variable foo -Scope Global -ErrorAction SilentlyContinue`工作得很好.例如:`if(Get-Variable foo -Scope Global -ErrorAction SilentlyContinue){$ true} else {$ false}`将输出:`False` (4认同)
  • 我个人会用stej的答案; 我评论了它,我也赞成了它.我不能再删除这个了. (2认同)
  • 我不会 该答案更特定于正在发生的操作,从而提高了代码的可读性。 (2认同)

Ver*_*Ray 13

个人喜好是IgnoreSilentlyContinue这里使用,因为它根本不是错误.因为我们期望它可能会$false阻止它(有Ignore)被放入$Error堆栈中(尽管是静默的).

您可以使用:

if (Get-Variable 'foo' -Scope Global -ErrorAction 'Ignore') {
    $true
} else {
    $false
}
Run Code Online (Sandbox Code Playgroud)

更简洁:

[bool](Get-Variable 'foo' -Scope 'Global' -EA 'Ig')
Run Code Online (Sandbox Code Playgroud)

输出任一:

False
Run Code Online (Sandbox Code Playgroud)

另外

您可以捕获变量不存在时引发的错误.

try {
    Get-Variable foo -Scope Global -ErrorAction 'Stop'
} catch [System.Management.Automation.ItemNotFoundException] {
    Write-Warning $_
}
Run Code Online (Sandbox Code Playgroud)

输出:

WARNING: Cannot find a variable with the name 'foo'.
Run Code Online (Sandbox Code Playgroud)

  • 同意:既然你正在检查它,这不是一个错误。应该是“忽略”d。 (2认同)

小智 7

简单的:

 [boolean](get-variable "Varname" -ErrorAction SilentlyContinue)
Run Code Online (Sandbox Code Playgroud)