月份: 2018-09

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

脚本文件里的 Hybrid Script(混合式脚本)

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

问题描述:

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

正确设置了 PowerShell 的关联

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

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

脚本本身没有问题

错误原因:

这个错误原因其实挺显然的——在 Windows 下双击执行,等同于运行 PowerShell.exe,并向其传入了脚本文件的完整地址作为参数。但 Windows Explorer 在传递 %1 时没有加引号,PowerShell.exe 也没有对此做检查。结果就是,只要脚本所在的目录含有空格,PowerShell.exe 就会把空格前半段视为文件地址,而把空格后半段视为另一个运行参数。

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

解决办法

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

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

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

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

  • 双击运行效果:
  • 混合脚本显示的是 CMD 的黑窗口

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

题外话:

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

[风暴英雄语音站] 如何帮助更新数据

1. 下载 这个文件📚,解压出一个 vos-master 目录。目录不大,解压到哪里都行。

2. 打开目录 vos-master,你只需要关心其中的 static 目录,其它文件都可以删掉。

3. static 目录下,有个 libs.csv 文件。右键点击它,用记事本打开

虽然是 csv 文件,但由于文本编码格式(UTF-8)原因,如果你直接双击用 Excel 打开,会出现中文乱码的问题。解决办法有几种:

  1. 用 Excel 导入方式:先打开 Excel,再通过菜单 数据 → 自文本 导入 csv,并在『文件原始格式』选择 65001: Unicode (UTF-8)。
  2. 使用现代化的文本编辑软件:VS CodeSublime Text 并借助其强大的插件功能更方便地编辑

4. 找到你想修改的英雄/地图/播报员的名字。比如 失落的维京人。它的中文名后跟随有四个逗号分隔的数字,,”200,201,202,203″,记住这些数字。
5. 打开和 libs.csv 同层的 sheets 目录,找到里面四个文件,200.csv、201.csv、202.csv、203.csv,按步骤 3 一样方式打开。
6. 打开 hero.thnuclub.com 页面,选择失落的维京人并切换为『显示文件名』模式。
7. 逐行比较 csv 文件和页面语音的内容,根据文件名一一对应,修正 csv 文件内的错误。修改完成以后,将改正的 csv 通过邮件或者 QQ 发给我。我会更新到线上。
8. 你的名字将会出现在这里:。这里的位置很大。

————
其它事项:

1. 有些英雄/地图有多个 sheet,有些只有一个,目前为止播报员都只有一个 sheet。
2. 你发回给我的文件不需要强求 csv,用 .xls 或者其它的格式都可以,只需要保证内容正确,格式我会转换。
3. 你可以只修订中文部分,或者只修订英文部分。但请按至少一个 sheet 里的一种语言为单位订正数据,尽量避免改一两行便要求更新。
4. 编辑时注意逗号的位置,不要修改中英文台词名的其它内容,避免出现列偏差。
5. 如果你懂得 git,也可以直接发送 pull request。
6. 感谢你的帮助。