【问题标题】:Powershell invoke-command and system variablesPowershell 调用命令和系统变量
【发布时间】:2012-07-27 05:05:43
【问题描述】:

我正在为供应商应用程序自动执行补丁。我想使用 powershell 遍历服务器列表并使用远程处理安装在每个盒子上。然而,一方面让我很头疼。在执行安装脚本之前,我必须调用供应商提供的 cmd 脚本来设置系统变量。所以我在powershell中这样调用脚本:

Invoke-Command -session $session {cmd /k ($args[0]+"\data\env.bat")} -Args $lesDestDir

我看到它执行,因为它在我的 powershell 窗口中呼应了它的工作,但随后调用了安装脚本,即:

Invoke-Command -session $session {perl ".\rollout-2010.pl " $args[0] " NC"} -Args $rollout

立即退出,说它使用的各种系统变量尚未设置。有人可以向我解释系统变量的范围吗?在调用命令完成后它们是否不复存在?我是否需要在一个调用命令中将两个脚本调用串在一起,以便第二个脚本可以访问系统变量或类似的东西?

【问题讨论】:

    标签: powershell invoke-command system-variable


    【解决方案1】:

    使用SET 命令所做的更改不是永久的,它们仅适用于当前的cmd 进程并一直保持到cmd 进程终止。

    如果可能的话,使用 powershell 语法设置环境变量:

    Invoke-Command -session $session {$env:myvar = 1}
    

    或者,您可以使用 cmd 命令分隔符 & 将命令串起来,如下所示:

    Invoke-Command -session $session {cmd /k "set myvar = 1" `& "set"}
    

    【讨论】:

    • 也许我遗漏了一些东西,但下面的内容不应该回显 1 的值:Invoke-Command -session $session {cmd /k "set myvar=1" `& "echo % myvar%"} 它不产生任何输出。
    • 在读取命令时(在命令中设置之前)发生变量扩展。要延迟变量的扩展,请在调用 cmd.exe 时添加 /v 开关并使用 !而不是 %: Invoke-Command -session $session {cmd /v /k "set mytar=2 & echo !mytar!"}
    • 感谢您提供的示例和清晰的解释。我能够完成我正在做的事情。
    【解决方案2】:

    是的,您需要将它们串在一起。在退出的第一个 cmd 会话中设置环境变量,然后在没有它们的情况下启动第二个。

    【讨论】:

      猜你喜欢
      • 2018-07-08
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 2015-01-01
      • 2013-04-04
      • 2015-12-20
      • 2011-05-23
      • 1970-01-01
      相关资源
      最近更新 更多