以下 powershell 脚本将输出A、B、A
$x = "A"
function scopetest()
{
Write-Host $x;
$x = 'B'
Write-Host $x
}
scopetest
Write-Host $x
现在奇怪的是:
首先A值来自全局范围 - 它可以在该函数内部读取,因此显然该变量是存在的。但是,如果我按原样写入该变量,乙值不会在函数外部保存。
我期望出现以下两种结果之一:[空], B, A或者A、B、B(后者是实现的,如果我写使用$全局:x = 'B')。
为什么全局变量$x在函数内部可读,但不可写?
答案1
从https://technet.microsoft.com/en-us/library/hh847849.aspx
在某个范围内创建的项目只能在创建它的范围内更改,除非您明确指定不同的范围。
因此您可以用来$Global:x = ...
设置它。
Powershell 脚本经常被复制并粘贴到块中以实现功能,并且方法经常被编写以供多个脚本使用。通过将赋值限制在变量的定义范围内,您可以确保即使两个粘贴的代码块使用相同的变量名,它们也不能不正确地更改另一个块所依赖的数据,除非明确说明它们希望这样做。这有助于使块更加模块化,并有助于识别无意的名称冲突。
编辑:
关于 powershell 作用域的说明:Powershell 级联作用域,因此本地作用域始终包含在祖先作用域(parent、grantparent、global 等)中定义的对象。这意味着全局定义的变量或在父堆栈框架(调用函数的函数)中定义的变量始终可访问,而子作用域中定义的对象则不可访问。在这种情况下,唯一的限制是子作用域不能修改父作用域的值,除非明确定义了该作用域。
从:https://technet.microsoft.com/en-us/library/hh847849.aspx
以下是范围的基本规则:
- An item you include in a scope is visible in the scope in which it was created and in any child scope, unless you explicitly make it private. You can place variables, aliases, functions, or Windows PowerShell drives in one or more scopes. - An item that you created within a scope can be changed only in the scope in which it was created, unless you explicitly specify a different scope. If you create an item in a scope, and the item shares its name with an item in a different scope, the original item might be hidden under the new item. But, it is not overridden or changed.