繁体   English   中英

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

[英]Use shebang/hashbang in Windows Command Prompt

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

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

我知道我可以写一个简单的批处理文件来运行它与节点,但我想知道它是否可以在内置的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

这是一种强制窗口支持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%

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

Windows根本不像Unix / Linux 那样设计

是否有类似的shell扩展

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

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

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

命令提示符不支持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等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM