如何测试PowerShell中是否存在脚本范围的变量?

时间:2010-05-04 08:45:53

标签: powershell

是否可以测试PowerShell中是否存在脚本范围的变量?

我一直在使用PowerShell Community Extensions (PSCX),但我注意到如果在设置Set-PSDebug -Strict时导入模块,则会产生错误:

The variable '$SCRIPT:helpCache' cannot be retrieved because it has not been set.
At C:\Users\...\Modules\Pscx\Modules\GetHelp\Pscx.GetHelp.psm1:5 char:24

在研究如何解决这个问题时,我在Pscx.GetHelp.psm1中找到了这段代码:

#requires -version 2.0

param([string[]]$PreCacheList)

if ((!$SCRIPT:helpCache) -or $RefreshCache) {
    $SCRIPT:helpCache = @{}
}

这是非常简单的代码;如果缓存不存在或需要刷新,请创建一个新的空缓存。问题是在$SCRIPT:helpCache生效时调用Set-PSDebug -Strict会导致错误,因为该变量尚未定义。

理想情况下,我们可以使用Test-Variable cmdlet,但这样的东西不存在!我考虑过查看variable:提供程序,但我不知道如何确定变量的范围。

所以我的问题是:如何在Set-PSDebug -Strict生效期间测试变量是否存在,而不会导致错误?

3 个答案:

答案 0 :(得分:5)

使用test-path variable:SCRIPT:helpCache

if (!(test-path variable:script:helpCache)) {
  $script:helpCache = @{}
}

这对我没有问题。 使用此代码检查:

@'
Set-PsDebug -strict
write-host (test-path variable:script:helpCache)
$script:helpCache = "this is test"
write-host (test-path variable:script:helpCache) and value is $script:helpCache
'@ | set-content stricttest.ps1

.\stricttest.ps1

答案 1 :(得分:4)

尝试这个技巧:

Get-Variable [h]elpCache -Scope Script

它不应该抛出或发出任何错误,因为我们使用通配符[h]elpCache。另一方面,这种通配符实际上是一个字面名称。

答案 2 :(得分:1)

您可以将Get-Variable-Scope参数一起使用。此cmdlet(默认情况下至少)不会返回变量的值,而只返回PSVariable对象,如果找不到变量,则会抛出异常:

Get-Variable foo -Scope script