如何将多行批处理文件语句转换为 Powershell?



我正在将旧的批处理文件转换为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 "$DRIVEDIREXECUTABLE.exe -FLAG1 -FLAG2 -FLAG3"

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

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

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

  • 要使外部程序(子进程(查看变量,它们必须是环境变量:使用$env:VAR1 = 'VAL1'而不是$VAR1 = 'VAL1'- 还要注意值必须如何引用

    • cmd.exe(批处理文件(中,所有变量总是环境变量;在 PowerShell 中,常规变量(如$VAR1(仅对 PowerShell 会话本身可见。
  • 如果可执行文件名称/路径被引号和/或包含变量引用,则不要使用Start-Process调用外部控制台应用程序,直接调用它们(同步调用,使用连接到 PowerShell 流的标准流(,使用&;不要引用整个命令行;如有必要,指定和 - 如有必要 -分别引用可执行文件名称/路径和参数。
    同样,通常应避免Invoke-Expression

因此:

$env:VAR1 = 'VAL1'
$env:VAR2 = 'VAL2'
$env:VAR3 = 'VAL3'
& "$DRIVEDIREXECUTABLE.exe" -FLAG1 -FLAG2 -FLAG3

最新更新