Используйте shebang / hashbang в командной строке Windows - PullRequest
31 голосов
/ 25 июля 2011

В настоящее время я использую сценарий serve для обслуживания каталогов с Node.js в Windows 7. Он хорошо работает в оболочке MSYS или с использованием sh, как яЯ поместил node.exe и скрипт serve в мой ~ / bin (который находится в моем PATH), и набрав просто «serve», работает из-за директивы Shebang (#!), которая сообщает оболочкезапустить его с узлом.

Однако командная строка Windows, похоже, не поддерживает нормальные файлы без расширения * .bat или * .exe и директивы shebang.Есть ли какие-либо ключи реестра или другие хаки, которые я могу получить, чтобы заставить это поведение из встроенного cmd.exe?

Я знаю, что мог бы просто написать простой пакетный файл, чтобы запустить его с узлом, ноМне было интересно, можно ли это сделать во встроенном режиме, поэтому мне не нужно писать сценарий для каждого такого сценария, как этот?

Обновление: На самом деле, я думал,Можно ли написать обработчик по умолчанию для всех «файлов не найден» и т. д., которые я мог бы автоматически попытаться выполнить в sh -c?

Спасибо.

Ответы [ 6 ]

50 голосов
/ 25 июля 2011

Да, это возможно при использовании переменной окружения 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.

Затем вам нужно зарегистрировать правильный «интерпретатор» с этим расширением, используя команды FTYPE и ASSOC:

ASSOC .foo=FooScript
FTYPE FooScript=foorunner.exe %1 %*

(Приведенный выше пример бесстыдно взят из справки, предоставленной ftype /?.)

ASSOC и FTYPE будут записывать данные непосредственно в реестр, поэтому вам потребуется административная учетная запись для их запуска.

18 голосов
/ 16 марта 2013

На самом деле выглядит так, как будто кто-то, кто знает, как писать командные файлы лучше, чем я, тоже подошел к этому.Их пакетный файл может работать лучше.

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

1 голос
/ 16 марта 2013

Вот простой способ заставить 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%
1 голос
/ 25 июля 2011

Нет, нет способа «заставить» командную строку сделать это.

Windows просто не была разработана , как Unix / Linux.

Есть ли расширение оболочки , которое делает что-то подобное?

Не то, чтобы я слышал, но об этом нужно спросить у Супер пользователя, а не здесь.

0 голосов
/ 22 февраля 2018

Командная строка не поддерживает 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 и т. Д.

0 голосов
/ 21 декабря 2017

Нет способа выполнить случайный файл, если это не фактический исполняемый двоичный файл. Функция Windows CreateProcess () просто не предназначена для этого. Единственные файлы, которые он может выполнить, это файлы с MZ magic или с расширениями из списка %PATHEXT%.

Однако сама CMD имеет ограниченную поддержку пользовательских интерпретаторов через предложение EXTPROC. Ограничение заключается в том, что интерпретатор должен также поддерживать и опускать это предложение при его исполнении.

...