【问题标题】:How can I convert a multi-line batch file statement into Powershell?如何将多行批处理文件语句转换为 Powershell?
【发布时间】:2019-12-24 23:13:10
【问题描述】:

我正在将旧的批处理文件转换为 Powershell。在批处理文件中,SET 命令用于声明和设置多个变量,然后调用使用这些变量以及附加标志的可执行文件。我将如何在 Powershell 中执行此操作?

批处理文件代码摘录:

SET VAR1=VAL1
SET VAR2=VAL2
SET VAR3=VAL3
SET VAR4=VAL4
%DIRECTORY%\%SUBDIR%\EXECUTABLE.EXE -FLAG1 -FLAG2 -FLAG3

我首先尝试声明 Powershell 变量并使用 Start-Process 调用 exe,但可执行文件正在寻找特定的变量名。我不确定在这种情况下 exe 是否可以看到这些变量,但它不起作用。

  $VAR1 = VAL1
  $VAR2 = VAL2
  $VAR3 = VAL3
Start-Process "$DRIVE\DIR\EXECUTABLE.exe -FLAG1 -FLAG2 -FLAG3"

我也尝试将多行命令传递给命令外壳,但未成功:

$Command =  "CMD.exe /C 
             SET VAR1=VAL1
             SET VAR2=VAL2
             SET VAR3=VAL3
             SET VAR4=VAL4
             $DRIVE\$DIR\EXECUTABLE.exe -FLAG1 -FLAG2 -FLAG3
Invoke-Expression $Command

注意** 变量必须设置在多行上,即使我从 DOS 提示符运行 exe 也是如此。使用“&”(批处理)或“;” (Powershell)并在一行上传递所有变量不起作用。

【问题讨论】:

  • 我想运行c:\folder1\EXECUTABLE.exe -FLAG1 -FLAG2 -FLAG3 是不可能的。
  • -FLAG1 -FLAG2 -FLAG3 应该是 -%VAR1% -%VAR2% -%VAR3% 还是 $VAR1 $VAR2 $VAR3 还是与您的问题完全无关?
  • 不,它们是不同的值。设置变量,然后将一组不同的标志传递给可执行文件。

标签: powershell batch-file


【解决方案1】:
  • 对于外部程序(子进程)要查看变量,它们必须是环境变量:使用$env:VAR1 = 'VAL1' 而不是$VAR1 = 'VAL1' - 还要注意必须如何引用这些值 em>。

    • cmd.exe(批处理文件)中,所有变量都是环境变量;在 PowerShell 中,$VAR1 等常规变量仅对 PowerShell 会话本身可见。
  • 不要使用Start-Process 调用外部控制台应用程序,直接调用它们(同步,使用连接到 PowerShell 流的标准流),如果可执行文件名称 /路径被引用和/或包含变量引用;不要引用命令行作为一个整体;指定并 - 如有必要 - 引用可执行文件名称/路径和参数单独
    同样,Invoke-Expression should generally be avoided

因此:

  $env:VAR1 = 'VAL1'
  $env:VAR2 = 'VAL2'
  $env:VAR3 = 'VAL3'
  & "$DRIVE\DIR\EXECUTABLE.exe" -FLAG1 -FLAG2 -FLAG3

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2011-01-07
    相关资源
    最近更新 更多