是否可以测试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
生效期间测试变量是否存在,而不会导致错误?
答案 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