Powershell 脚本:传递带有“”的参数,如 $Arg="$somePath" 应该导致 "c:\temp\" 包括 ""

Powershell Script: Pass parameter with "" like $Arg="$somePath" should result in "c:\temp\" including the ""

这是我关于 Whosebug 的第一个问题,所以请放轻松。

问题: 从 Powershell 脚本调用外部 EXE 文件应该如下所示。

C:\temp\someEXE.exe "batch" "B:\some path with spaces\file name with spaces.jpg" "" "C:\some other path"

我在 ps1 脚本中的 $Arguments 变量看起来像这样。

$Arguments = '"batch"', "$Originalpath", '""', "$Outpath$Outfile"
Start-Process -Wait -FilePath "C:\Temp\SomeExe.exe" -ArgumentList "$Arguments"

参数 1“batch”和 3,空的“”与“”“”(单-双-双-单)一起工作。

但是当我使用“$Variable”(单双双单)时,它没有根据引用规则进行解释(https://docs.microsoft.com/de-de/powershell/module/microsoft.powershell.core/about/about_quoting_rules?view=powershell-7.1

所以我的问题是: 我如何从 $Originalpath 到“B:\some path with spaces\file name with spaces.jpg”,包括。 “”

提前致谢

更新: 当我添加一行以将参数写入日志文件时,这一行提供了我所需要的。

Write-output '"batch"',`"$Original`",'""',`"$AIAusgabepfad$Originaldatei$Originaltyp`" | Out-file C:\Temp\Startup.log -append

但是当我以同样的方式尝试我的 $Arguments 时,脚本窗口弹出并在同一秒内消失。

一般来说: 要同步执行控制台应用程序或批处理文件,请直接调用它们(C:\temp\someEXE.exe ...), 使用Start-Process - 请参阅this answer and this GitHub docs issue detailing appropriate vs. non-appropriate use cases and requesting that guidance be added to the Start-Process 帮助主题。

  • 也就是说,请注意,从 PowerShell 7.1 开始,传递 空字符串 参数 ("") 已损坏,需要 解决方法 '""'.

  • 类似地,传递带有嵌入 " 字符的参数。如 .

    中所述,也已损坏
  • 现在正在 GitHub issue #14747 中讨论 选择加入 修复,但请注意,如果您选择加入该修复,旧的解决方法将中断.


如果你需要使用Start-Process:

虽然 -ArgumentList 参数是 array 类型的 ([string[]]),但允许您单独传递参数 - 你试图利用它 - 不幸的是,如果 Start-Process 包含 嵌入的空格 [= 则它们无法正确处理这些单独传递的参数67=](有关更详细的讨论,请参阅 GitHub issue #5576), so the robust solution is to use a single -ArgumentList argument comprising all arguments, with embedded double-quoting, as necessary (see )。

Start-Process -Wait -FilePath "C:\Temp\SomeExe.exe" -ArgumentList `
  "batch `"$Originalpath`" `"`" `"$Outpath$Outfile`""

请注意,这种传递参数的方法 - 作为带有嵌入式引号和转义的单个字符串传递给 Start-Process -ArgumentList - 不会 受到困扰 直接调用:结果字符串按原样传递给进程(在Windows)。