这是一个非常简单的PowerShell脚本,从CMD执行时与通过PowerShell ISE执行时的行为不同:
$computerName = "AG562446"
$computerRole = "AllRoles"
Function initialize() {
""
"From the function initialize()"
" computerName = " + $computerName
" computerRole = " + $computerRole
""
$Global:computerName = "AGBATCHSVR01"
$Global:computerRole = "Batch"
""
"After local assignment inside initialize()"
" computerName = " + $computerName
" computerRole = " + $computerRole
""
}
Function main() {
initialize
""
" computerName = " + $computerName
" computerRole = " + $computerRole
""
}
main
通过CMD执行时:
C:\> powershell C:\Temp\test.ps1
From the function initialize()
computerName = AG562446
computerRole = AllRoles
After local assignment inside initialize()
computerName = AG562446
computerRole = AllRoles
computerName = AG562446
computerRole = AllRoles
C:\>
从ISE执行时(使用 F5 运行 / 继续命令):
PS C:\Windows\System32\WindowsPowerShell\v1.0> C:\Temp\test.ps1
From the function initialize()
computerName = AG562446
computerRole = AllRoles
After local assignment inside initialize()
computerName = AGBATCHSVR01
computerRole = Batch
computerName = AGBATCHSVR01
computerRole = Batch
当通过CMD运行脚本时,“Global:”说明符似乎没有任何效果。我在这里错过了什么?如何修改函数内的全局变量?
答案 0 :(得分:3)
你真的在修改全局变量。但是,当您仅引用$computerName
或$computerRole
时,PowerShell会在全局变量之前找到您在脚本顶部定义的脚本作用域变量。这就是PowerShell中动态范围的工作原理。
如果您想要专门阅读和/或编写全局变量,请始终使用$global:<variableName>
。但是,使用全局变量通常不是一个好主意。您已在脚本范围提供了默认值,因此为什么不引用它们,例如:
$Script:computerName = "AGBATCHSVR01"
$Script:computerRole = "Batch"
ISE采取不同行为的原因是当您通过pressing F5
运行或启动调试会话时,ISE实际上是逐行将脚本复制到控制台,因此全局变量和脚本变量变为同一个。如果转到ISE命令窗格并键入:
C:\Temp\test.p1 <enter>
您将看到此时它的行为与CMD(或PowerShell.exe)类似。