gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:28:29 25 4
gpt4 key购买 nike

这是一个非常简单的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运行脚本时,“全局:”说明符似乎没有任何作用。我在这里想念什么?如何在函数内部修改全局变量?

最佳答案

您确实在修改全局变量。但是,当您仅引用$computerName$computerRole时,PowerShell会在您的脚本顶部找到具有相同名称的全局变量之前定义的脚本范围变量。这就是PowerShell中动态作用域的工作方式。

如果要专门读取和/或写入全局变量,请始终使用$global:<variableName>。但是,使用全局变量通常不是一个好主意。您在脚本作用域提供了默认值,所以为什么不引用它们,例如:

$Script:computerName = "AGBATCHSVR01"
$Script:computerRole = "Batch"

ISE行为不同的原因是,当您通过 pressing F5运行或启动调试 session 时,ISE本质上是逐行将脚本复制到控制台,因此全局变量和脚本变量成为一个并相同。如果转到ISE命令 Pane 并键入:
C:\Temp\test.p1 <enter> 

您将看到这一次它的行为类似于CMD(或PowerShell.exe)。

关于powershell - 尝试访问全局变量时,CMD和PowerShell ISE之间的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25655763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com