尝试访问全局变量时,CMD和PowerShell ISE之间的行为不同

时间:2014-09-04 00:52:03

标签: powershell powershell-v3.0

这是一个非常简单的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:”说明符似乎没有任何效果。我在这里错过了什么?如何修改函数内的全局变量?

1 个答案:

答案 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)类似。