現在、Windows 7で serve スクリプトを使用して Node.js でディレクトリを提供しています。これは、MSYSシェルまたはsh
を使用して正常に機能します。 node.exeとserveスクリプトを〜/ bin(PATH上にあります)に配置しましたが、「serve」と入力するだけで機能します Shebang (#!
)シェルにノードで実行するように指示するディレクティブ。
ただし、Windowsコマンドプロンプトは、*。batまたは* .exe拡張子、またはShebangディレクティブのない通常のファイルをサポートしていないようです。組み込みのcmd.exe
からこの動作を強制するために取得できるレジストリキーやその他のハックはありますか?
単純なバッチファイルを作成してノードで実行できることはわかっていますが、組み込みのファションで実行できるかどうか疑問に思っていたので、このようなすべてのスクリプトに対してスクリプトを作成する必要はありませんか?
更新:実際、私が考えていたのは、すべての「ファイルが見つかりません」などのデフォルトのハンドラーを記述して、内部で自動的に実行を試みることができるかどうかです。 sh -c
?
ありがとう。
はい、これはPATHEXT
環境変数を使用して可能です。これは例えば.vbs
または.wsh
スクリプトを「直接」実行するように登録するためにも使用されます。
まず、PATHEXT
変数を拡張して、そのサーブスクリプトの拡張子を含める必要があります(以下では、Node.jsがわからないため、拡張子は.fooであると想定しています)。
デフォルト値は次のようなものです。
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変数の値を保持するために必要です。
次に、コマンドFTYPE
およびASSOC
を使用して、正しい「インタープリター」をその拡張子に登録する必要があります。
ASSOC .foo=FooScript
FTYPE FooScript=foorunner.exe %1 %*
(上記の例は、ftype /?
が提供するヘルプから恥知らずに引用されています。)
ASSOCとFTYPEはレジストリに直接書き込むため、それらを実行するには管理者アカウントが必要になります。
実際、私がこれに取り組んだよりも、バッチファイルの書き方をよく知っている人のように見えます。彼らのバッチファイルはもっとうまくいくかもしれません。
http://whitescreen.nicolaas.net/programming/windows-shebangs
Windowsは単純に設計されていません Unix/Linuxのように。
聞いたことはありませんが、ここではなく、スーパーユーザーに尋ねる必要があります。
これは、ウィンドウに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%
コマンドプロンプトはShebangをサポートしていませんが、バッチと他の言語の構文を1つのファイルに組み合わせることができるさまざまな言語のハイブリッド手法がたくさんあります。質問が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などの他の多くの言語で実行することが可能です。
実際に実行可能なバイナリファイルでない限り、ランダムファイルを実行する方法はありません。 Windows CreateProcess()関数はそのために設計されていません。実行できるファイルは、MZ
マジックまたは%PATHEXT%
リストの拡張子を持つファイルのみです。
ただし、CMD自体は、EXTPROC
句を介したカスタムインタープリターのサポートが制限されています。制限は、インタプリタもその実行でこの句をサポートおよび省略する必要があるということです。