Today is a big day, you got your first light-
saber. Now you must go to Jedi Temple immedi-
ately get your Jedi Knight certificate. May
the Force be with you.
在 Windows 下,即使正确关联了 .ps1 的打开方式,Powershell 也无法正常运行脚本,只有一闪而过的报错信息。
正确设置了 PowerShell 的关联
使用录屏软件捕获到这一闪而过的错误信息
而首先打开 PowerShell 终端,并在终端里指定执行脚本,则可以正确执行:
脚本本身没有问题
错误原因:
这个错误原因其实挺显然的——在 Windows 下双击执行,等同于运行 PowerShell.exe,并向其传入了脚本文件的完整地址作为参数。但 Windows Explorer 在传递 %1 时没有加引号,PowerShell.exe 也没有对此做检查。结果就是,只要脚本所在的目录含有空格,PowerShell.exe 就会把空格前半段视为文件地址,而把空格后半段视为另一个运行参数。
echo "" echo ================================ echo "You can run PS1 correctly here." echo "But can't run it by double click." echo ================================ echo ""
PowerShell 接到消息以后,又执行了一遍这个 Hybrid.bat。这次是 PS 视角,因此上来就忽略了前面整大段的“注释”,直接从 Add-Type -AssemblyName System.Windows.Forms 这段开始,绘制窗口,等待用户选择,获得列表文件路径,然后再返回给 CMD。CMD 最后再执行 for /f "delims=" %%I in ( ...... ) do ( ...... ) 的部分,并根据 goto :EOF 的指示,跳过剩余代码,避免了在 CMD 环境下的报错。
因此,为了正确执行功能,Hybrid Script 的核心思想是:
1. 利用两种语言的注释符号的不同,隐藏非执行环境下的代码。 2. 灵活应用两种语言的特性,确保任一语言下的注释符号本身,对于另一种语言没有负面效果。 3. 首先执行的语言 A,需要把脚本文件自身的路径,传递给另一种语言 B 的执行器。 4. B 语言的执行器,忽略掉被 B 语言注释符号包裹起来的 A 语言代码,执行 B 的代码,如果需要的话,把执行结果返回给 A。 5. A 继续执行剩下的部分,忽略掉被 A 语言的注释符号包裹起来的 B 语言代码。 6. Hybrid Script 至少会执行两遍,可能更多。
1. Windows Batch & Windows PowerShell 2. Windows Batch & Linux Bash 3. Windows Batch & Python 4. Windows Batch & Javascript 5. Linux Bash & Python 6. Linux Bash & Javascript 7. NodeJS & Python 8. …
1. 因为传播渠道问题,不适合拆分成多个脚本的。比如互联网上常见的『复制粘贴代码到记事本改后缀为 .bat 然后双击运行』。 2. 代码票友,对 A 语言和 B 语言都不甚精通,或者从 A 转 B 的学习过程中,B 还不甚了解,需要用 A 语言的代码补足。 3. A 语言确实功能有限,但胜在编码方便历史普及率高。而产品虽需要却也只需要 B 的极小功能。比如本文示例。 4. 写着玩。