web-dev-qa-db-ja.com

WindowsコマンドプロンプトでShebang / hashbangを使用する

現在、Windows 7で serve スクリプトを使用して Node.js でディレクトリを提供しています。これは、MSYSシェルまたはshを使用して正常に機能します。 node.exeとserveスクリプトを〜/ bin(PATH上にあります)に配置しましたが、「serve」と入力するだけで機能します Shebang#!)シェルにノードで実行するように指示するディレクティブ。

ただし、Windowsコマンドプロンプトは、*。batまたは* .exe拡張子、またはShebangディレクティブのない通常のファイルをサポートしていないようです。組み込みのcmd.exeからこの動作を強制するために取得できるレジストリキーやその他のハックはありますか?

単純なバッチファイルを作成してノードで実行できることはわかっていますが、組み込みのファションで実行できるかどうか疑問に思っていたので、このようなすべてのスクリプトに対してスクリプトを作成する必要はありませんか?

更新:実際、私が考えていたのは、すべての「ファイルが見つかりません」などのデフォルトのハンドラーを記述して、内部で自動的に実行を試みることができるかどうかです。 sh -c

ありがとう。

32
Adam M-W

はい、これは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はレジストリに直接書き込むため、それらを実行するには管理者アカウントが必要になります。

50

実際、私がこれに取り組んだよりも、バッチファイルの書き方をよく知っている人のように見えます。彼らのバッチファイルはもっとうまくいくかもしれません。

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

18
Doug

いいえ、コマンドプロンプトにこれを「強制」する方法はありません。

Windowsは単純に設計されていません Unix/Linuxのように。

似たようなことをするシェル拡張はありますか?

聞いたことはありませんが、ここではなく、スーパーユーザーに尋ねる必要があります。

1
Mehrdad

これは、ウィンドウに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%
1
Doug

コマンドプロンプトは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などの他の多くの言語で実行することが可能です。

0
npocmaka

実際に実行可能なバイナリファイルでない限り、ランダムファイルを実行する方法はありません。 Windows CreateProcess()関数はそのために設計されていません。実行できるファイルは、MZマジックまたは%PATHEXT%リストの拡張子を持つファイルのみです。

ただし、CMD自体は、EXTPROC句を介したカスタムインタープリターのサポートが制限されています。制限は、インタプリタもその実行でこの句をサポートおよび省略する必要があるということです。

0
AnrDaemon