PowerShell执行Start-Process时如何转义路径中的空格?
问题原因
PowerShell 5.1版本中Start-Process的-ArgumentList参数存在默认参数拆分逻辑:即便你用单引号包裹了带空格的路径,PowerShell传递参数给目标程序时,依然会把空格作为参数分隔符,把单个路径拆分为两个独立参数传递,因此Typora接收到的是两个不完整的路径参数,才会提示文件不存在。
解决方案
方案1:为路径额外嵌套转义双引号(保留Start-Process用法)
在路径外层额外包裹一层转义后的双引号,强制PowerShell将整个路径作为单个参数传递,转义双引号可以用反引号(`)实现:
Start-Process -FilePath 'C:\Program Files\Typora\Typora.exe' -ArgumentList "`"C:\Users\Administrator\Desktop\Hello world.md`""
也可以用三个双引号的写法实现同样的转义效果:
Start-Process -FilePath 'C:\Program Files\Typora\Typora.exe' -ArgumentList """C:\Users\Administrator\Desktop\Hello world.md"""
方案2:使用调用运算符&(无需额外转义)
如果你不需要Start-Process提供的后台启动、指定运行权限等特殊功能,直接使用PowerShell的调用运算符&启动程序更简单,单引号包裹的带空格路径会被直接识别为单个参数:
& 'C:\Program Files\Typora\Typora.exe' 'C:\Users\Administrator\Desktop\Hello world.md'
方案3:升级PowerShell版本
PowerShell 7及以上版本已经修复了Start-Process的参数拆分bug,你原来的原始写法在高版本PowerShell中可以直接正常运行,无需修改。
内容的提问来源于stack exchange,提问作者lanyuanxiaoyao
相关产品推荐
相关产品推荐

