【问题标题】:Modifying variable in parent script using child script in powershell使用powershell中的子脚本修改父脚本中的变量
【发布时间】:2020-02-27 13:34:43
【问题描述】:

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

父.ps1

$count = $Null

child.ps1

$count = 10

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

【问题讨论】:

  • $global:count = 10。见About Scopes
  • 您是如何启动 child.ps 脚本的?如果您不需要它在自己的脚本范围内运行,您可以点源它。这样您就可以避免使用全局变量。
  • @ManuelBatsching 是的,我在父脚本中调用子脚本...是否可以使用子脚本更新父脚本中的变量?

标签: powershell variables scope


【解决方案1】:

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

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

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

# 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 指的是调用范围的 parent 范围(2 将指代 grandparent 范围,等等) - 请参阅 Set-Variable

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

为了完整起见:

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

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

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

    • 有关 PowerShell 的动态范围和 $private: 范围的详细信息,请参阅 this answer

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

【讨论】:

    【解决方案2】:

    通过使用点源运算符.,您可以在与 parent.ps1 脚本相同的范围内运行 child.ps1 脚本。这将保留您的子脚本所做的所有变量更改(请参阅:script scope and dot sourcing)。

    让你的 parent.ps1 的内容是这样的:

    $count = $null
    . .\child.ps1
    $count
    

    这将返回10

    【讨论】:

    • 值得注意的是,这间接解决了问题,但有一个主要的副作用:所有子脚本的(脚本级)变量都是直接在父脚本的范围内创建,这可能是不可取的。
    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 2018-01-20
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2022-07-28
    相关资源
    最近更新 更多