在Windows命令提示符中使用shebang / hashbang

我正在使用服务脚本来在Windows 7上提供Node.js的目录。它在MSYS shellsh运行良好,因为我已经把node.exe和服务脚本放在了我的〜/ bin中在我的PATH上),而input“serve”是因为它是Shebang ( #! )指令,它告诉shell使用节点运行它。

但是,Windows命令提示符似乎不支持没有* .bat或*。exe扩展名的普通文件,也不支持shebang指令。 是否有任何registry项或其他黑客,我可以强制从内置的cmd.exe这种行为?

我知道我可以写一个简单的batch file来运行它,但是我想知道是否可以在一个内置的fasion中完成,所以我不必为每个脚本写一个脚本?

更新:其实,我在想,是否有可能为所有'找不到的文件'编写一个默认的处理程序,我可以自动尝试在sh -c执行?

谢谢。

是的,这可以使用PATHEXT环境变量。 例如,它也被用于注册.vbs.wsh脚本以“直接”运行。

首先,您需要扩展PATHEXT变量以包含该服务脚本的扩展名(在下面,我假设扩展名是.foo,因为我不知道Node.js)

默认值是这样的:

 PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC 

你需要改变它(通过控制面板)看起来像这样:

 PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.FOO 

使用控制面板(控制面板 – >系统 – >高级系统设置 – >环境变量是必要的,以保持PATHEXT变量的值。

然后,您需要使用命令FTYPEASSOC ,使用该扩展名注册正确的“解释器”:

 ASSOC .foo=FooScript FTYPE FooScript=foorunner.exe %1 %* 

(上面的例子是从ftype /?提供的帮助中无耻地获取的。)

ASSOC和FTYPE将直接写入注册表,所以您将需要一个管理帐户来运行它们。

其实看起来像一个知道如何编写批处理文件比我也接近这个更好的人。 他们的批处理文件可能会更好。

http://whitescreen.nicolaas.net/programming/windows-shebangs

不,没有办法“强制”命令提示符来执行此操作。

Windows 并不像Unix / Linux 那样设计

有没有一个类似的外壳扩展

不是我听说过的,但应该问超级用户,而不是在这里。

这里是一个简单的方法来强制Windows支持shebang,但它有一个关于文件命名的警告。 将以下文本复制到批处理文件中,并在REM注释中遵循一般概念。

 @echo off REM This batch file adds a cheesy shebang support for windows REM Caveat is that you must use a specific extension for your script files and associate that extension in Windows with this batch program. REM Suggested extension is .wss (Windows Shebang Script) REM One method to still easily determine script type visually is to use double extensions. eg script.pl.wss setlocal enableextensions disabledelayedexpansion if [%1] == [] goto usage for /f "usebackq delims=" %%a IN (%1) do ( set shebang=%%a goto decode_shebang ) :decode_shebang set parser=%shebang:~2% if NOT "#!%parser%" == "%shebang%" goto not_shebang :execute_script "%parser%" %* set exit_stat=%errorlevel% echo script return status: %exit_stat% goto finale :not_shebang echo ERROR script first line %shebang% is not a valid shebang echo maybe %1 is not a shebanged script goto finale :usage echo usage: %0 'script with #! shebang' [scripts args]+ echo This batch file will inspect the shebang and extract the echo script parser/interpreter which it will call to run the script :finale pause exit /B %exit_stat%