De link
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.
para que você possa usar $Global:x = ...
para defini-lo.
Os scripts do Powershell geralmente são copiados e colados em blocos para implementar a funcionalidade, e geralmente os métodos são escritos para serem usados por vários scripts. Ao restringir a atribuição ao escopo de definição de uma variável, você garante que, mesmo se dois blocos de código colados usarem o mesmo nome de variável, eles não poderão alterar os dados de que o outro bloco depende, sem declarar explicitamente que desejam fazer isso. Isso ajuda a tornar os blocos mais modulares e ajuda a identificar colisões de nomes não intencionais.
Editar:
uma nota sobre o escopo do powershell: Escopos em cascata Powershell, de modo que o escopo local sempre contém objetos definidos em escopos ancestrais (pai, pai / mãe, global, etc). Isso significa que uma variável definida globalmente ou em um quadro de pilha pai (uma função que chama uma função) está sempre acessível, enquanto os objetos definidos em escopos filho não são. Nesse caso, a única restrição é que um escopo filho não pode modificar um valor de escopos pai, a menos que esse escopo seja definido explicitamente.
De: link
The following are the basic rules of scope:
- 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.