【问题标题】:Source .bat file script variables in PowerShellPowerShell 中的源 .bat 文件脚本变量
【发布时间】:2019-02-26 00:08:27
【问题描述】:

我正在 PowerShell 中寻找一种方法,将环境变量从运行 .bat 文件脚本中获取到 Env: 提供程序中。

是否有与 twa_env.cmd 等效的可以在 PowerShell 中正确设置 TWS 的环境?

我可以启动一个 cmd.exe shell,调用 twa_env.cmd,然后启动 PowerShell。这似乎行得通。我还不能做的是启动 PowerShell shell,运行 twa_env.cmd,然后将新的变量设置带回 PowerShell Env:。

【问题讨论】:

  • 是的:& tws_env.bat。环境变量将在 powershell 会话中创建。
  • @TheIncorrigible1 - 那真是太好了。根据您的经验,它有效吗?启动 PowerShell 控制台,运行 & tws_env.bat,然后运行 ​​conman 或 composer。这对你有用吗?
  • 我暂时没有安装,但是在powershell会话中执行批处理脚本并运行Get-Command -Name co*
  • @Bill_Stewart - 是的,答案非常接近。它几乎与我尝试的相同,但我使用的是Invoke-Command。它仍然没有为 TWS 创建工作环境。我还在调查。

标签: powershell tivoli-work-scheduler


【解决方案1】:

PowerShell 可以运行cmd.exe shell 脚本(批处理文件),但它(自然)必须使用cmd.exe 执行它。问题是当cmd.exe 可执行文件关闭时,它设置的环境变量不会传播到调用PowerShell 会话。

解决方法是“捕获”cmd.exe 会话中设置的环境变量,并在批处理文件完成后手动将它们传播到 PowerShell。以下Invoke-CmdScript PowerShell 函数可以为您做到这一点:

# Invokes a Cmd.exe shell script and updates the environment.
function Invoke-CmdScript {
  param(
    [String] $scriptName
  )
  $cmdLine = """$scriptName"" $args & set"
  & $Env:SystemRoot\system32\cmd.exe /c $cmdLine |
    Select-String '^([^=]*)=(.*)$' |
    ForEach-Object {
      $varName = $_.Matches[0].Groups[1].Value
      $varValue = $_.Matches[0].Groups[2].Value
      Set-Item Env:$varName $varValue
  }
}

【讨论】:

  • 这确实有效。它对我不起作用,因为应用程序 -REQUIRES- 管理员权限。我不明白为什么需要这样做,但我没有编写应用程序。它也适用于我使用的Invoke-Expression。我会给你支票以获取另一个答案的副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
相关资源
最近更新 更多