36

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

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

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

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

谢谢。

4

5 回答 5

54

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

于 2011-07-25T15:13:46.503 回答
3

命令提示符不支持 shebang ,但是有很多针对不同语言的混合技术,您可以将批处理和其他语言语法组合在一个文件中。由于您的问题涉及 node.js,这里是一个批处理-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 等。

于 2018-02-22T14:41:29.223 回答
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%
于 2013-03-16T11:15:12.380 回答
1

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

Windows的设计根本不像 Unix/Linux。

有没有做类似事情的外壳扩展

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

于 2011-07-25T14:57:37.727 回答
0

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

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

于 2017-12-21T12:21:03.750 回答