微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Powershell 脚本:使用 "" 传递参数,如 $Arg="$somePath" 应导致 "c:\temp\" 包括 ""

如何解决Powershell 脚本:使用 "" 传递参数,如 $Arg="$somePath" 应导致 "c:\temp\" 包括 ""

这是我关于 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"' (single-double double-single) 时,它不会根据引用规则 (https://docs.microsoft.com/de-de/powershell/module/microsoft.powershell.core/about/about_quoting_rules?view=powershell-7.1) 进行解释

所以我的问题是: 我如何从 $Originalpath 到“B:\一些带有空格的路径\带有空格.jpg的文件名”包括。 “”

提前致谢

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

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

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

解决方法

一般来说: 要同步执行控制台应用程序或批处理文件,请直接调用它们 (C:\temp\someEXE.exe ...),不要 使用 Start-Process - 请参阅 this answerthis GitHub docs issue,详细说明适当与不适当的用例,并要求将指南添加到 Start-Process 帮助主题.

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

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

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


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

虽然 " 参数是数组类型(-ArgumentList),但允许您单独传递参数 - 您已经尝试过利用 - 不幸的是,如果[string[]] 包含嵌入空格(请参阅GitHub issue #5576),则Start-Process 无法正确处理这些单独传递的参数,因此可靠的解决方案是使用单个 -ArgumentList 参数,该参数包含所有 参数,并根据需要嵌入双引号(有关更详细的讨论,请参阅 this answer)。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。