2

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

问题:从 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 时,脚本窗口会在同一秒内弹出并消失。

4

1 回答 1

0

通常 :同步C:\temp\someEXE.exe ...Start-Process执行控制台应用程序批处理文件直接调用它们Start-Process

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

  • 同样,传递带有嵌入"字符的参数。如this answer中所述,也已损坏。

  • 现在正在GitHub 问题 #14747中讨论选择加入修复,但请注意,如果您选择加入该修复,旧的解决方法将失效


如果您确实需要使用Start-Process

虽然-ArgumentList参数是数组类型[string[]]_ _ _ Start-Process_ _ _,因此可靠的解决方案是使用包含所有参数的单个 参数,并根据需要嵌入双引号-ArgumentList(有关更详细的讨论,请参阅此答案)。

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

请注意,这种传递参数的方法 - 作为具有嵌入式引用和转义传递的单个字符串Start-Process -ArgumentList-不受直接调用困扰的错误的影响:生成的字符串按原样传递给进程(在 Windows 上)。

于 2021-02-22T03:25:42.483 回答