作用域如何影响powershell脚本

在批处理脚本中,默认情况下,对环境变量的更改对当前会话具有全局影响。对于PowerShell,情况正好相反,因为作用域用于隔离脚本的修改。在这里,我们将探讨作用域如何影响PowerShell脚本,以及如何在它们内部和周围工作。...

作用域如何影响powershell脚本

在批处理脚本中,默认情况下,对环境变量的更改对当前会话具有全局影响。对于PowerShell,情况正好相反,因为作用域用于隔离脚本的修改。在这里,我们将探讨作用域如何影响PowerShell脚本,以及如何在它们内部和周围工作。

什么是范围(a scope)?

在PowerShell中,“scope”指的是脚本或命令shell正在运行的当前环境。作用域用于保护环境中的某些对象不被脚本或函数无意中修改。特别是,除非这些命令中的参数另有规定,否则从另一个作用域运行的命令可以保护以下内容不受修改:

  • 变量
  • 别名
  • 功能
  • PowerShell驱动器(PSDrives)

无论何时运行脚本或函数,或创建新的会话或PowerShell实例,都会创建新的作用域。通过运行脚本和函数创建的作用域与从中创建它们的作用域具有“父/子”关系。有几个作用域具有特别特殊的含义,可以通过名称进行访问:

  • 全局范围是在PowerShell启动时创建的范围。它包括内置到PowerShell的变量、别名、函数和PSDrives,以及由PowerShell配置文件生成的任何变量、别名、函数和PSDrives。
  • 本地作用域是指当前作用域是什么。启动PowerShell时,它将引用全局范围,在脚本中它将是脚本范围,等等。
  • 脚本作用域是在脚本运行时创建的。在这个范围内操作的命令只有脚本中的那些。
  • 可以在当前作用域中定义专用作用域,以防止其他作用域中的命令能够读取或修改它们可能有权访问的项。

在某些命令中,作用域也可以通过数字来引用,其中当前作用域被称为零,其祖先被递增的整数引用。例如,在从全局范围运行的脚本中,脚本范围将是0,全局范围将是1。进一步嵌套在脚本范围内的范围(例如函数)将全局范围称为2。但是,负数不适用于引用子作用域—其原因很快就会显现出来。

作用域如何影响命令

如前所述,在一个作用域中执行的命令不会影响另一个作用域中的内容,除非明确要求这样做。例如,如果全局作用域中存在$MyVar,并且脚本运行命令将$MyVar设置为不同的值,则$MyVar的全局版本将保持不变,而$MyVar的副本将与新值一起放置在脚本作用域中。如果$MyVar不存在,则脚本将默认在脚本范围内创建它,而不是在全局范围内。在了解作用域之间的实际父/子关系时,记住这一点很重要。

PowerShell中作用域的父/子关系是单向的。命令可以查看当前作用域、其父作用域以及该作用域之上的任何作用域,也可以修改当前作用域。但是,它们无法查看或修改当前作用域的任何子级中的内容。这主要是因为,一旦移动到父作用域中,子作用域就已经被销毁,因为它已经实现了它的目的。例如,在脚本终止后,为什么必须从全局范围中查看或修改脚本范围中的变量?在很多情况下,您需要脚本或函数的更改在其完成后保持不变,但在脚本或函数的作用域中,您需要在其运行之前或之后对其对象进行更改的情况并不多。(通常,这些事情都会作为脚本或函数本身的一部分来处理。)

当然,没有例外的规则是什么?上面提到的一个例外是私有作用域。专用作用域中的对象只能由在创建它们的作用域中运行的命令访问。另一个重要的例外是具有AllScope属性的项。这些是特殊变量和别名,任何范围的更改都会影响所有范围。以下命令将显示哪些变量和别名具有AllScope属性:

Get-Variable | Where-Object {$_.Opti*** -match 'AllScope'} Get-Alias | Where-Object {$_.Opti*** -match 'AllScope')

作用域

在我们第一次了解作用域时,我们将从PowerShell会话开始,其中变量$MyVar被设置为字符串,'我是一个全局变量!,从命令行。然后,将从名为Scope的文件运行以下脚本-演示.ps1:

Function FunctionScope { 'Changing $MyVar with a function.' $MyVar = 'I got set by a function!' "MyVar says $MyVar" } '' 'Checking current value of $MyVar.' "MyVar says $MyVar" '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' "MyVar says $MyVar" '' FunctionScope '' 'Checking final value of MyVar before script exit.' "MyVar says $MyVar" ''

如果PowerShell脚本的工作方式与批处理脚本相同,那么$MyVar(或批处理语法中的%MyVar%)的值将从“我是全局变量!'到'我被剧本设定了!,最后是“我被一个函数设置了!'在再次显式更改或会话终止之前,它将一直保留在该位置。但是,当我们遍历每个作用域时,看看这里实际发生了什么——特别是在FunctionScope函数完成其工作之后,我们再次从脚本检查变量,然后检查全局作用域。

作用域如何影响powershell脚本

正如您所看到的,当我们在脚本中移动时,变量似乎发生了变化,因为直到FunctionScope函数完成之前,我们都是在上次更改的同一范围内检查变量。但是在FunctionScope完成之后,我们又回到脚本范围中,$MyVar保持不变。然后,当脚本终止时,我们返回到全局范围,在那里它根本没有被修改。

超出本地范围

因此,这对帮助您避免意外地将更改应用到脚本和函数之外的环境是很好的,但是如果您真的想进行这样的修改呢?对于创建和修改超出本地范围的对象,有一种特殊且相当简单的语法。您只需将作用域名称放在变量名称的开头,并在作用域和变量名称之间放一个冒号。这样地:

$global:MyVar $script:MyVar $local:MyVar

在查看和设置变量时都可以使用这些修饰符。让我们看看这个演示脚本会发生什么:

Function FunctionScope { '' 'Changing $MyVar in the local function scope...' $local:MyVar = "This is MyVar in the function's local scope." 'Changing $MyVar in the script scope...' $script:MyVar = 'MyVar used to be set by a script. Now set by a function.' 'Changing $MyVar in the global scope...' $global:MyVar = 'MyVar was set in the global scope. Now set by a function.' '' 'Checking $MyVar in each scope...' "Local: $local:MyVar" "Script: $script:MyVar" "Global: $global:MyVar" '' } '' 'Getting current value of $MyVar.' "MyVar says $MyVar" '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' "MyVar says $MyVar" FunctionScope 'Checking $MyVar from script scope before exit.' "MyVar says $MyVar" ''

和前面一样,我们将首先在全局范围内设置变量,然后检查最终的全局范围结果。

作用域如何影响powershell脚本

在这里,您可以看到FunctionScope能够更改脚本范围中的变量,并在完成后保持更改。而且,对全局范围内变量的更改即使在脚本退出之后仍然存在。如果您必须使用相同的代码重复更改脚本内或全局范围内的变量,这一点尤其有用—您只需定义一个函数或脚本,该函数或脚本是为修改变量而编写的,在需要的位置和方式进行修改,并在需要更改时调用该函数或脚本即可。

如前所述,作用域编号也可以在某些命令中使用,以便在与本地作用域相关的不同级别修改变量。下面的脚本与上面第二个示例中使用的脚本相同,但是修改了函数以使用具有作用域编号的Get Variable和Set Variable命令,而不是直接引用具有命名作用域的变量:

Function FunctionScope { '' 'Changing $MyVar in scope 0, relative to FunctionScope...' Set-Variable MyVar "This is MyVar in the function's scope 0." –Scope 0 'Changing $MyVar in scope 1, relative to FunctionScope...' Set-Variable MyVar 'MyVar was changed in scope 1, from a function.' –Scope 1 'Changing $MyVar in scope 2, relative to Functi***cope...' Set-Variable MyVar 'MyVar was changed in scope 2, from a function.' –Scope 2 '' 'Checking $MyVar in each scope...' ‘Scope 0:’ Get-Variable MyVar –Scope 0 –ValueOnly ‘Scope 1:’ Get-Variable MyVar –Scope 1 –ValueOnly ‘Scope 2:’ Get-Variable MyVar –Scope 2 –ValueOnly '' } '' 'Getting current value of $MyVar.' "MyVar says $MyVar" '' 'Changing $MyVar by script.' $MyVar = 'I got set by a script!' "MyVar says $MyVar" FunctionScope 'Checking $MyVar from script scope before exit.' "MyVar says $MyVar" '' 007Ys3FFgy1gpfa4qdbiwj30i209g3ye

与之前类似,我们可以在这里看到一个作用域中的命令如何修改其父作用域中的对象。

附加信息

对于作用域,仍有许多工作可以完成,本文无法容纳这些工作。作用域影响的不仅仅是变量,还有更多关于私有作用域和AllScope变量的知识需要学习。有关更多有用信息,可以从PowerShell中运行以下命令:

Get-Help about_scopes

TechNet上也提供了相同的帮助文件。


Scope图片来源:openclipart上的spadassin

  • 发表于 2021-04-11 03:54
  • 阅读 ( 250 )
  • 分类:互联网

你可能感兴趣的文章

powershell foreach、while和其他循环的工作原理

学习编程的关键第一步是使用循环。谢天谢地,PowerShell将随着您的技能不断增长。 ...

  • 发布于 2021-03-11 23:17
  • 阅读 ( 443 )

可提高windows管理技能的powershell cmdlet

Powershell是一个完美的方式,一个新的编码器开始在Windows上。Powershell是命令行工具和脚本语言的等价部分。它使您能够通过您用来管理计算机的相同命令使计算机自动化。如果您有一个现代的Windows系统,那么您已经有了Powershell...

  • 发布于 2021-03-13 13:26
  • 阅读 ( 286 )

使用powershell而不是批处理脚本的5个原因

大多数用户从未听说过PowerShell,更不用说触摸它并试用了。这可能是因为这个名字,听起来像是只有铁杆IT极客才会使用的东西。或者是因为PowerShell的好处还不清楚。可能是因为最初的学习曲线。 ...

  • 发布于 2021-03-15 16:49
  • 阅读 ( 281 )

7个简单的windows脚本,为您节省时间和精力

... 使用powershell编写脚本 ...

  • 发布于 2021-03-15 21:37
  • 阅读 ( 281 )

如何在linux上安装和使用powershell

Windows PowerShell是一个优秀的配置管理和自动化框架。它由命令行shell和基于.NET的脚本语言组成。管理员使用PowerShell作为管理Windows、Linux和网络客户端的一种手段。 ...

  • 发布于 2021-03-16 02:34
  • 阅读 ( 303 )

如何轻松地从Windows10中删除臃肿软件

...去除。也有一些不同的删除选项:使用传统的卸载、使用PowerShell命令和第三方安装程序。 ...

  • 发布于 2021-03-22 17:00
  • 阅读 ( 367 )

如何在Windows10中打开本地组策略编辑器

... 三。通过命令提示符/powershell ...

  • 发布于 2021-03-23 10:55
  • 阅读 ( 431 )

Windows10中打开powershell的9种方法

PowerShell是一种比命令提示符更强大的命令行shell和脚本语言。自从Windows10发布以来,它就成了默认的选择,而且有很多方法可以打开它。 PowerShell的使用更为复杂,但它比命令提示符更加健壮和强大。这就是为什么它成为高级用...

  • 发布于 2021-04-02 10:35
  • 阅读 ( 238 )

windows10的新bashshell所能做的一切

...中运行Windows命令。 您可以将Bash命令合并到批处理脚本或PowerShell脚本中,这非常方便。有关所有这些和更多信息,请参阅我们的指南,以在Windows 10中bash脚本。 从linux shell外部运行linux命令 相关:如何在windows10上从bashshell外部...

  • 发布于 2021-04-06 14:44
  • 阅读 ( 261 )

如何检查您的电脑或手机是否受到保护,以防熔毁和幽灵

...于使用的图形工具,它将向您显示这些信息,而无需运行PowerShell命令和解码技术输出。 运行此工具后,您将看到一些重要的细节: 容易熔毁:如果这上面写着“是的!“,则需要从Windows Update安装修补程序,以保护计算机免...

  • 发布于 2021-04-06 20:54
  • 阅读 ( 292 )
别搞我心态
别搞我心态

0 篇文章

相关推荐