首先是 .bat 脑残。一个 .bat 调用另一个 .bat 必须用 call 语句,否则调用完了后就直接退出不接着执行了这点就不说了,之前被这个“有趣”的特性折腾了无数次,基本上是习惯了。古怪的 iffor 语法,糟糕的括号匹配原则,搞得写一个能正常运行的 .bat 就跟炼金术似的。而最可恶的事情是在 .sh 中最有用的特性之一 set -e,在 .bat 里居然没有对应的功能,.bat 的设计者难道不知道包装另一个脚本并原样传递错误码,是对任何一种脚本来说都非常重要的功能么?

然后是 .js 脑残。默认的解释器是 wscript 而不是 cscript,这样一来我如果不在命令行指明 cscript,直接输入 .js 的文件名来运行,我就没法读写控制台。而如果指明了 cscript,我就无法获得自动在 path 中查找 .js 文件的能力,必须给出 .js 的全路径,再没有比这更糟糕的事情了。为了避免每次都敲一大串cscript c:\the\full\path\to\my\script.js,我只好再创建一个同名的 .bat 文件,再在里面调用 .js 文件。还好,微软把 .bat 的查找优先级放在了 .js 之前,所以至少我可以只写文件名而不用非得把 .bat 也写出来。

再然后是微软脑残。不知道最初的时候是什么目的,非得把程序分成 GUI 程序和 Console 程序两类,GUI 程序就不能读写控制台(当然你可以用 AllocConsole 弄出一个控制台来,但那不是“当前”控制台。如果你在控制台下启动那个 GUI 程序,它会再弹出一个新的控制台),而 Console 程序虽然可以弹出 GUI,但如果你在资源管理器里双击它运行的话,它会先弹出一个黑色的控制台窗口,然后才弹出相应的 GUI 窗口。这个神奇的 feature 导致 WSH 要分成 wscript 和 cscript,Java 要分成 java 和 javaw,Python 要分成 python 和 pythonw,等等。当初如果像 Linux 那样 GUI 程序和 Console 程序一视同仁不就什么事情也没有了么?

还有就是 WSH 脑残,搞了个极其古怪的 WScript.Shell 对象,调用另一个控制台程序极其麻烦。即使是用 cscript 启动的脚本,用 WshShell.Run 调用的控制台程序也不能读写当前控制台,非得把输出写到一个新的控制台下。如果想把数据写到当前控制台,就必须用 WshShell.Exec 来返回一个极其复杂和怪异的对象,然后该对象提供了读取另一个程序控制台输出的管道,你得自己从管道中读取数据然后自己输出。由于不知道 WSH 中如何实现多线程,所以我至今还是不知道在调用另一个 Console 程序时,如何让 stdoutstderr 都能同时正常输出信息。用 WSH 作为工作脚本根本就是自虐。

最后就是我自己脑残,瞎折腾了一个下午,搞了一堆 .bat、.js,就没有意识到这种工作用 .py 来做又简单又快捷,什么麻烦都没有。正如 Guido 所说:“人生苦短,我用 Python。”