我正在将旧批处理文件转换为 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"
我也未能成功尝试将多行命令传递到命令 shell:
$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) 并在一行上传递所有变量不起作用。
最佳答案
要让外部程序(子进程)查看变量,它们必须是环境变量:使用
$env:VAR1 = 'VAL1'
而不是$VAR1 = 'VAL1'
- 另请注意必须如何引用值。- 在
cmd.exe
(批处理文件)中,所有变量都是环境变量;在 PowerShell 中,$VAR1
等常规变量仅对 PowerShell session 本身可见。
- 在
不要使用
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
关于powershell - 如何将多行批处理文件语句转换为Powershell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57561722/