从后一个问题开始:
作用域与函数和调用的脚本(cmdlet)一起发挥作用,例如:
Function Test {
$Test++
Write-Host 'Local:' $Test
}
$Test = 5
Test
Write-Host 'Global:' $Test
Returns:
Local: 6
Global: 5
And:
Function Test {
$Global:Test++
Write-Host 'Local:' $Test
}
$Test = 5
Test
Write-Host 'Global:' $Test
Returns:
Local: 6
Global: 6
或者,如果您将函数放入脚本中(例如MyScript.ps1
):
$Test = 5
.\MyScript.ps1
Write-Host $Test # $Test is unaffected unless you use the $Global scope in your script
这将返回与上面基本相同的结果,除非你点源您的脚本将在当前范围内运行:
$Test = 5
. .\MyScript.ps1
Write-Host $Test # $Test might be affected by MyScript.ps1 if you just use $Test
对于你正在做的事情:
您正在创建一个完整的新 PowerShell 会话(使用Powershell.exe
) 将以新的变量列表开始。
请注意,如果您这样做,您将再次看到初始变量exit
从新会话开始:
PS C:\> $Name = "John"
PS C:\> Powershell.exe
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
Try the new cross-platform PowerShell https://aka.ms/pscore6
PS C:\> Write-Host 'New session' $Name
New session
PS C:\> Exit
PS C:\> Write-Host 'Initial session' $Name
Initial session John
关于第一个问题,我认为没有很多应用程序需要明确引用$Local
范围,但给你一个可以使用它的例子:
$Test = 5
Function Test {
Write-Host ($Local:Test++)
}
Test
在上面的例子中一元增量运算符将从0
如果你明确使用$Local
范围(实际上你从一个空的局部变量开始,它将转换为0
) 与5
如果你省略$Local
您将继承的副本的范围$Test
变量超出父范围。