我正在将旧的批处理文件转换为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