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

在PowerShell中,如何测试全局范围中是否存在特定变量?,powershell,Powershell,我正在使用PowerShell脚本实现WPF应用程序的一些UI自动化。通常,基于全局变量的值,脚本作为一个组运行。当我只想运行一个脚本时,手动设置这个变量有点不方便,所以我正在寻找一种方法来修改它们,以检查这个变量,如果找不到,就设置它 测试路径变量:\foo似乎不起作用,因为我仍然收到以下错误: 无法检索变量“$global:foo”,因为尚未设置该变量 到目前为止,有效的答案似乎是 为了进一步说明这一点,对我起作用的是: 获取变量-Name foo-Scope Global-ea Silen

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

测试路径变量:\foo似乎不起作用,因为我仍然收到以下错误:

无法检索变量“$global:foo”,因为尚未设置该变量


到目前为止,有效的答案似乎是

为了进一步说明这一点,对我起作用的是:

获取变量-Name foo-Scope Global-ea SilentlyContinue | out null


美元?返回true或false。

编辑:在下面使用。我自己的(部分不正确)一个仍在此处复制以供参考:


你可以用

Get-Variable foo -Scope Global
并捕获变量不存在时引发的错误。

可与特殊语法一起使用:

Test-Path variable:global:foo
try {
    Get-Variable foo -Scope Global -ErrorAction 'Stop'
} catch [System.Management.Automation.ItemNotFoundException] {
    Write-Warning $_
}
这也适用于环境变量(
$env:foo
):

对于非全局变量(仅
$foo
inline):


您可以为Get variable的返回值分配一个变量,然后检查它是否为null:

$variable = Get-Variable -Name foo -Scope Global -ErrorAction SilentlyContinue

if ($variable -eq $null)
{
    Write-Host "foo does not exist"
}

# else...
请注意,必须将变量指定给某个对象才能使其“存在”。例如:

$global:foo = $null

$variable = Get-Variable -Name foo -Scope Global -ErrorAction SilentlyContinue

if ($variable -eq $null)
{
    Write-Host "foo does not exist"
}
else
{
    Write-Host "foo exists"
}

$global:bar

$variable = Get-Variable -Name bar -Scope Global -ErrorAction SilentlyContinue

if ($variable -eq $null)
{
    Write-Host "bar does not exist"
}
else
{
    Write-Host "bar exists"
}
输出:

foo exists
bar does not exist

还有一个更简单的方法:

if ($variable)
{
    Write-Host "bar exist"
}
else
{
    Write-Host "bar does not exists"
}
简单:
[布尔值](获取变量“Varname”-ErrorAction SilentlyContinue)

个人偏好是在这里使用
忽略
而不是
SilentlyContinue
,因为它根本不是错误。由于我们预期它可能是
$false
,因此我们防止它(使用
忽略
)被放入
$Error
堆栈中(尽管是静默的)

您可以使用:

if (Get-Variable 'foo' -Scope 'Global' -ErrorAction 'Ignore') {
    $true
} else {
    $false
}
更简洁地说:

[bool](gv foo -s global -ea ig)
任一项的输出:

False
WARNING: Cannot find a variable with the name 'foo'.
或者 您可以捕获变量不存在时引发的错误

try {
    Get-Variable foo -Scope Global -ErrorAction 'Stop'
} catch [System.Management.Automation.ItemNotFoundException] {
    Write-Warning $_
}
输出:

False
WARNING: Cannot find a variable with the name 'foo'.

测试variavle MyVariable的存在性。 返回布尔值true或false


测试路径变量:\MyVariable

啊,不错。为什么我还要问PS问题;-)。不过,我不能再删除我的答案了。因为cmd.exe很无聊:)不需要删除,所有可能的答案都可以激发灵感。我使用了这个概念,但在我的例子中,我必须测试变量:local:foo如果变量不是全局的,请确保不包含“全局的”部分。有人介意提供这个语法的文档吗?在这个线程中,他们进一步提到了测试路径变量:global:foo将按照stej的答案工作;我对此评论如此,我也投了更高的票。我再也不能移除这个了,我不会。这个答案更具体地针对正在发生的操作,提高了代码的可读性。@VertigoRay:使用异常作为控制流机制对我来说总是有点不好的味道。是的,从历史上看,您不得不用shell语言来实现这一点,但这并不是一个好主意。在这种情况下,您需要检查变量是否存在<变量提供程序上的代码>测试路径
正是这样做的。Get变量为您提供值或错误。您不必捕获错误<代码>获取变量foo-Scope Global-ErrorAction SilentlyContinue
工作正常。例如:
if(Get Variable foo-Scope Global-ErrorAction SilentlyContinue){$true}否则{$false}
将输出:
false
我发布了另一个包含我所说内容的解决方案。如果$Variable确实存在,但等于$false,该怎么办?同意:既然您正在检查它,它就不是错误。应为“忽略”d。如果将
$env:variable
显式设置为
false
,则此选项不起作用。