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

标签 powershell batch-file

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

相关文章:

c# - Powershell.exe - 无法编译使用 var 的 C# 代码

windows - 批处理文件中的 for 循环读取文件路径的文件

java - 如何使用 Runtime.getRuntime().exec() 执行 ant 并关闭命令提示符

xml - 使用 Windows 批处理解析 XML 文件

batch-file - 为什么在管道 block 命令中进行 `IF` 比较时会出现错误消息?

powershell - 在 Powershell 中,是否有比自定义对象更好的方法来存储/查找 n 维数组中的数据

c# - 如何通过 C# 读取 PowerShell 退出代码

powershell - Azure Powershell 网站 cmdlet 在服务器上无法正常工作

windows - 将 Sitecore PowerShell 扩展与 native PowerShell 结合使用

Windows批量复制文件从子文件夹到一个文件夹