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

时间:2011-07-25 14:55:18

标签: windows unix shell command-prompt shebang

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

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

我知道我可以写一个简单的批处理文件来运行它与节点,但我想知道它是否可以在内置的fasion中完成所以我不必为每个脚本编写这样的脚本?

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

感谢。

6 个答案:

答案 0 :(得分:50)

是的,可以使用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将直接写入注册表,因此您需要一个管理帐户来运行它们。

答案 1 :(得分:18)

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

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

答案 2 :(得分:1)

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

Windows只是没有像Unix / Linux那样设计

是否有 shell扩展做类似的事情?

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

答案 3 :(得分:1)

这是一种强制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.  e.g.  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%

答案 4 :(得分:0)

除非是实际的可执行二进制文件,否则无法执行随机文件。 Windows CreateProcess()函数不是为它而设计的。它可以执行的唯一文件是具有MZ魔法或%PATHEXT%列表扩展名的文件。

但是,CMD本身通过EXTPROC子句对定制解释器的支持有限。限制是解释器在执行时也应该支持和省略该子句。

答案 5 :(得分:0)

命令提示符不支持shebang,但是有很多不同语言的混合技术允许在一个文件中组合批处理和其他语言语法。正如你的问题关注node.js这里是一个batch-node.js混合(使用.bat.cmd扩展名保存它:

0</* :{
        @echo off
        node %~f0 %*
        exit /b %errorlevel%
:} */0;


console.log(" ---Self called node.js script--- ");

console.log('Press any key to exit');
process.stdin.setRawMode(true);
process.stdin.resume();
process.stdin.on('data', process.exit.bind(process, 0));

可以使用许多其他语言,如Ruby,Perl,Python,PHP等。