Hybrid Script 附一则:解决 PowerShell 无法双击打开路径含空格文件的 Bug

栏目: 编程工具 · 发布时间: 6年前

内容简介:该文介绍了混合式脚本的原理和示例,这里补充一个实际适用的场景。这个错误原因其实挺显然的——在 Windows 下双击执行,等同于运行 PowerShell.exe 解释执行程序,并向其传入了脚本文件的完整地址作为参数,但 PowerShell.exe 却无法正确处理传入参数当中的空格。Windows Explorer 在传递 %1 时没有加引号,PowerShell.exe 也没有对此做检查。结果就是,只要脚本所在的目录含有空格,PowerShell.exe 就会把空格前半段视为文件地址,而把空格后半段视

该文介绍了混合式脚本的原理和示例,这里补充一个实际适用的场景。

问题描述:

在 Windows 下,即使正确关联了 .ps1 的打开方式,Powershell 也无法正常运行脚本,只有一闪而过的报错信息。

Hybrid Script 附一则:解决 PowerShell 无法双击打开路径含空格文件的 Bug

正确设置了 PowerShell 的关联

Hybrid Script 附一则:解决 PowerShell 无法双击打开路径含空格文件的 Bug

使用录屏软件捕获到这一闪而过的错误信息

而首先打开 PowerShell 终端,并在终端里指定执行脚本,则可以正确执行:

Hybrid Script 附一则:解决 PowerShell 无法双击打开路径含空格文件的 Bug

脚本本身没有问题

错误原因:

这个错误原因其实挺显然的——在 Windows 下双击执行,等同于运行 PowerShell.exe 解释执行程序,并向其传入了脚本文件的完整地址作为参数,但 PowerShell.exe 却无法正确处理传入参数当中的空格。

Windows Explorer 在传递 %1 时没有加引号,PowerShell.exe 也没有对此做检查。结果就是,只要脚本所在的目录含有空格,PowerShell.exe 就会把空格前半段视为文件地址,而把空格后半段视为另一个运行参数。

而通过先启动终端再指定脚本运行正常,就是因为没有传参这个过程,Powershell 自行请求了脚本文件,就能正常执行。

解决办法

解决办法却不容易。修改双击打开时的参数设置为其加上引号,这个太困难了。修改 PowerShell 程序本身,为其添加参数检查更是不可能,只能坐等微软更新。

剩下的只有两种办法,一是永远把 .ps1 脚本放在没有空格的目录里。不但本目录不能有空格,上级目录一直到盘符所在的根目录都不能有空格。这其实也挺麻烦的。

另一种办法就是用混合式脚本:

  • 代码示例:
<# : test.ps1.bat
@ECHO OFF
powershell -noprofile "iex (${%~f0} | out-string)"
goto :EOF
:: 以上是 bat 代码,用以正确向 PowerShell 传递带空格路径 / 以下是 PowerShell 代码,示例用的 echo #>
 
echo ""
echo ================================
echo "You can run PS1 correctly here."
echo "But can't run it by double click."
echo ================================
echo ""
 
cmd /c pause | out-null

虽然我们要写的是 PowerShell 脚本,但为了让脚本能支持在含空格的路径下双击执行,我们不得不首先以批处理文件的形式调用 CMD,然后让 CMD 向 PowerShell 正确地传递带上引号的完整路径。这样,PowerShell 就能正确识别脚本文件的位置,执行混合脚本里的 PowerShell 代码段,完成最初预期的功能。

  • 双击运行效果:
  • Hybrid Script 附一则:解决 PowerShell 无法双击打开路径含空格文件的 Bug

    混合脚本显示的是 CMD 的黑窗口

    因为混合脚本首先运行的是 CMD,所以窗口变成了黑色。但 PowerShell 的脚本确实正确执行了。

    题外话:

    1. 通常这种混合脚本我都会按语言命名为 ***.ps1.bat 以区别普通的 .bat,并提醒用户(也就是我自己)这需要 Windows 安装了 Powershell 才能正确执行。PowerShell 可以从 Windows 的系统组件里添加,Win10 则已经自带了。
    2. 为了截图方便,上文的示例代码最后一行其实又用到了 CMD 代码的 pause,所以这个示例代码严格来说是 CMD → Powershell → CMD 的三阶混合脚本。

    以上所述就是小编给大家介绍的《Hybrid Script 附一则:解决 PowerShell 无法双击打开路径含空格文件的 Bug》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

    查看所有标签

    猜你喜欢:

    本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

    天涯虚拟社区

    天涯虚拟社区

    刘华芹 / 民族出版社 / 2005-11 / 23.00元

    网络空间很复杂,好多人并不完全了解或者只是了解到一些皮毛。比如说好多人对于见网友一事总是抱着浪漫或者暖昧的想法,而事实却并不总是想象的那样。作者在做虚拟社区研究甚至是在有这个想法之前并不常呆在网上,互联网对于作者来说就是查查资料、收发信年、看看新闻的工具。担是看着越来越多的人把时间花在网上,一处文化上的直觉告诉作者:有一种新的生活方式产生了。强烈的好奇心驱使着作者走到了网上,走到了天涯虚拟社区,并......一起来看看 《天涯虚拟社区》 这本书的介绍吧!

    HTML 压缩/解压工具
    HTML 压缩/解压工具

    在线压缩/解压 HTML 代码

    CSS 压缩/解压工具
    CSS 压缩/解压工具

    在线压缩/解压 CSS 代码

    XML 在线格式化
    XML 在线格式化

    在线 XML 格式化压缩工具