使用Test-Path检查变量是否存在,其行为与我期望的不同

3

我在 PowerShell 脚本中有以下代码:

Write-Host "clusterName=$clusterName"

Write-Host (Test-Path variable:global:clusterName)

该函数返回以下输出:

clusterName=CorrectValue
False

现在很明显这个变量存在(因为它包含“CorrectValue”值),但如果是这样的话,我本来期望第二次调用Write-Host返回“true”,而不是“false”。我在In PowerShell, how do I test whether or not a specific variable exists in global scope?上找到了“Test-Path…”代码,但显然它没有像我想象的那样工作。有人能解释一下吗?
谢谢!

$clusterName 是在哪里定义的?你能提供更多上下文吗?它是在一个模块、脚本还是 psake 脚本中呢? - Lloyd Holman
上面的代码存在于一个 psake 任务中。在同一个 psake 任务中,先前已经点源化了定义 $clusterName 的 .ps1 脚本。 - jamiet
嗯,不确定那是否可行,请阅读此链接:https://github.com/psake/psake/wiki/How-can-I-set-a-variable-in-one-task-and-reference-it-in-another%3F - Lloyd Holman
大家好,我已经找到了一个解决方案。通过将我的变量声明为具有全局作用域(即$global:clusterName =“SomeValue”),然后一切都按预期工作。我实际上还没有弄清楚为什么不在显式声明全局作用域的情况下它不起作用(当@LloydHolman链接到关于psake的文章时,我认为他可能会想到一些东西),但现在它对我来说已经可以工作了,这是我关心的主要事情。 - jamiet
只是为了支持关于psake影响变量行为的理论...我在被点源的脚本中定义了"$global:DebugPreference = "Continue"; $global:VerbosePreference = "Continue";",但这并没有打开后面调用的psake任务中任何内容的详细和调试输出。唯一的方法是在psake任务的顶部显式设置"$global:DebugPreference = "Continue";$global:VerbosePreference = "Continue";",才能打开psake任务内部代码的详细和调试输出。这就好像psake的东西在“进程外”运行(缺乏更好的术语)。 - jamiet
显示剩余2条评论
1个回答

2

脚本中定义的变量不会在全局范围内创建,除非您显式使用$global:修饰符来命名变量。(一般情况下,这是您想要的,因为全局变量往往会在脚本完成后继续存在。)

您可以通过使用Test-Path variable:local:clusterName查看本地命名空间中的测试函数,或者使用Test-Path variable:script:clusterName查看脚本命名空间 - 这两个应该都是$true


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接