首页 > 解决方案 > 使用powershell中的子脚本修改父脚本中的变量

问题描述

我有两个 powershell 脚本。我必须使用子脚本分配父变量使用父powershell脚本调用子powershell脚本

父.ps1

$count = $Null

儿童.ps1

$count = 10

如何确保子脚本中的更改反映在父脚本中?

标签: powershellvariablesscope

解决方案


Manuel Batsching 的回答向您展示了如何使用点源来间接解决您的问题:通过直接在父脚本的范围内执行子脚本,所有子脚本的(脚本级)变量(以及其他定义,即函数和别名)直接在父脚本的范围内创建,这可能是不可取的。

PowerShell确实提供了在其他范围内选择性地修改变量的机制,但最好避免使用它们,因为您在脚本之间创建了紧密耦合,这使得它们难以维护;相反,使用其他机制在脚本之间传递信息,最简单的形式是通过output

如果您仍想通过修改父作用域中的变量来解决问题,可以使用以下方法:

# When run in child.ps1 that was invoked (normally) by parent.ps1,
# sets $count to 1 in the scope of *parent.ps1*.
Set-Variable -Scope 1 -Name count -Value 10

Scope -1指调用作用域的作用域(2将指代祖父作用域,依此类推) - 请参阅Set-Variable.

作为补充,作用域修饰符$script:$global:可以与变量名一起使用,以定位(相同)脚本作用域和全局作用域中的变量(例如,$script:foo = 'bar'可用于从同一脚本中定义的函数内部设置脚本级变量;应避免创建或修改全局about_Scopes变量,因为它们即使在脚本退出后仍然存在) - 请参阅.

为了完整起见:

  • 范围修饰符$local:允许您显式引用当前(本地)范围;它很少使用,因为当您仅通过名称分配给变量时(例如,创建局部变量) ,会隐含当前范围。$foo = 'bar'$foo

    • 但是,获取变量$local:foo不一定与仅相同$foo:由于 PowerShell 的动态作用域,如果在当前$foo作用域中不存在此类变量,则返回祖先作用域中的变量值(如果有) ;相反,如果在当前范围内定义了该名称,则严格返回该变量的值。$local:foo

    • 抑制给定变量的动态范围,即防止后代范围看到它(默认情况下),请使用$private:范围修饰符创建它。

    • 有关 PowerShell 的动态范围和范围的更多信息,请参阅此答案$private:

  • 范围修饰符$using:用于远程处理作业的上下文中;它实际上并没有在调用者的上下文中引用变量本身,而是它的- 请参阅about_Remote_Variables.


推荐阅读