powershell - 使用powershell中的子脚本修改父脚本中的变量
问题描述
我有两个 powershell 脚本。我必须使用子脚本分配父变量使用父powershell脚本调用子powershell脚本
父.ps1
$count = $Null
儿童.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:
范围修饰符创建它。有关 PowerShell 的动态范围和范围的更多信息,请参阅此答案
$private:
。
范围修饰符
$using:
用于远程处理和作业的上下文中;它实际上并没有在调用者的上下文中引用变量本身,而是它的值- 请参阅about_Remote_Variables
.
推荐阅读
- resttemplate - Exchange RestTemplate 给出 400 Bad Request
- php - JSON API 因变量中的“(双引号)而失败
- sql - 如何在一个表中合并 Oracle SQL 中的多个行值
- scale - 当单位从公制更改为英制时,Openlayers 内的值会发生变化
- azure - 使用个人 Microsoft 帐户登录 Oauth2 v2 失败
- arrays - Alternate for Array Sum Formula
- apache-spark - 在 Pypsark 中如何在 RDD 中获取不同的值
- amazon-s3 - 通过 Java API 列出 S3 文件夹,不包括文件
- java - 如何通过递归从数组中找到第 i 个布尔值?
- java - 我可以使用 Spring Boot 使用别人的 API 发出请求吗?