我有两个Powershell脚本。我必须使用子脚本分配父变量使用父Powershell脚本调用子Powershell脚本
parent.ps1
$count = $Null
child.ps1
$count = 10
如何确保子脚本中的更改反映在父脚本中?
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:
scope修饰符创建它。
请参阅此答案以获取有关PowerShell动态范围和作用域的更多信息$private:
。
范围修饰符$using:
用于远程处理和作业的上下文中;它实际上并没有在调用者的上下文中引用变量本身,而是引用其值-see about_Remote_Variables
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句