Подтвердить что ты не робот

Использовать shebang/hashbang в командной строке Windows

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

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

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

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

Спасибо.

4b9b3361

Ответ 1

Да, это возможно с помощью переменной среды PATHEXT. Это, например, также используется для регистрации сценариев .vbs или .wsh для запуска "напрямую".

Сначала вам нужно расширить переменную PATHEXT, чтобы она содержала расширение этого сервиса script (в следующем я предполагаю, что расширение является .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 будут записываться непосредственно в реестр, поэтому для их запуска потребуется учетная запись администратора.

Ответ 2

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

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

Ответ 3

Нет, нет возможности "принудительно" вызвать командную строку.

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

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

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

Ответ 4

Вот простой способ заставить окна поддерживать 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%

Ответ 5

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

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