【问题标题】:Powershell global variable is not inherited by child scriptsPowershell 全局变量不被子脚本继承
【发布时间】:2018-06-13 17:41:03
【问题描述】:

我有一堆 powershell 脚本,被分解以保持模块化。但是,所有或大部分这些脚本都依赖于某些公共变量,例如它们与之通信的服务器等。我在全局范围内定义这些变量并使用 $global:{Variable} 语法在脚本中访问它们。

这在作为入口点的脚本中运行良好。但是,当主(入口点)脚本使用以下语法执行子脚本时,我不再可以读取同一全局变量的值。我得到的只是空字符串。

Powershell.exe -File .\Child-Script.ps1

我的理解是:

  1. powershell 中的父作用域由子作用域继承
  2. 在当前 shell 上下文中执行的所有脚本都应该可以使用全局范围。

我在这里缺少什么?请帮忙。

例子:

父脚本(Main-Script.ps1)

$global:ServerUrl="http://myserver.com"
Write-Host "ServerUrl (Main-Script): $global:ServerUrl"
Powershell.exe -File .\Child-Script.ps1

子脚本 (Child-Script.ps1)

Write-Host "ServerUrl (Child-Script): $global:ServerUrl"

输出

ServerUrl (Main-Script): http://myserver.com
ServerUrl (Child-Script): 

【问题讨论】:

  • 请用一个非常简短的示例脚本更新您的问题,说明问题并提供示例输出。
  • 感谢您的回复@Bill_Stewart。我根据您的建议添加了一个示例。
  • Powershell.exe -File .\Child-Script.ps1 告诉 powershell 在单独的上下文中运行脚本。只需点源子脚本:. .\Child-Script.ps1
  • 酷!这样可行!谢谢@EBGreen。如果您想将此作为答案发布,我可以将其标记为正确答案。

标签: powershell scope global-variables


【解决方案1】:

当您启动 Powershell.exe 时,您正在创建一个具有自己的全局上下文的新 powershell 会话。所以这个:

Powershell.exe -File .\Child-Script.ps1

将导致子脚本在不同的上下文中运行。相反,您可以“点源”子脚本,这将导致它在当前上下文中执行:

. .\Child-Script.ps1

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 2020-06-12
    • 2015-12-05
    • 1970-01-01
    • 2016-03-03
    • 2022-01-21
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多