Use shebang/hashbang en el símbolo del sistema de Windows
unix shell (6)
Actualmente estoy usando el script de servicio para servir directorios con Node.js en Windows 7. Funciona bien en el shell de MSYS o usando sh
, ya que he puesto node.exe y el script de servicio en mi ~ / bin (que está en mi RUTA), y escribir solo "servir" funciona debido a su directiva Shebang ( #!
) que le dice al shell que lo ejecute con el nodo.
Sin embargo, el símbolo del sistema de Windows no parece admitir archivos normales sin una extensión * .bat o * .exe, ni la directiva shebang. ¿Hay alguna clave de registro u otros hacks que pueda obtener para forzar este comportamiento fuera del cmd.exe
incorporado?
Sé que solo podría escribir un archivo por lotes simple para ejecutarlo con un nodo, pero me preguntaba si podría hacerse en una fasion integrada, ¿no tengo que escribir un script para cada script como este?
Actualización: En realidad, estaba pensando, ¿es posible escribir un controlador predeterminado para todos los ''archivos no encontrados'', etc. que podría intentar ejecutar automáticamente dentro de sh -c
?
Gracias.
No, no hay manera de "forzar" la línea de comandos para hacer esto.
Windows simplemente no fue diseñado como Unix / Linux.
¿Hay una extensión de shell que hace algo similar?
No es de lo que he oído hablar, pero eso debería preguntarse en el Superusuario, no aquí.
En realidad, parece que alguien que sabe cómo escribir archivos por lotes mejor de lo que yo también me he acercado a esto. Su archivo por lotes puede funcionar mejor.
http://whitescreen.nicolaas.net/programming/windows-shebangs
Esta es una forma sencilla de forzar las ventanas para que admitan shebang, sin embargo, tiene una advertencia con respecto a la denominación de archivos. Copie el siguiente texto en un archivo por lotes y siga la idea general en los comentarios 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%
La línea de comandos no admite shebang, sin embargo, existen muchas técnicas híbridas para diferentes idiomas que permite combinar la sintaxis de lotes y otros lenguajes en un archivo. Si su pregunta concierne a node.js, aquí hay un híbrido batch-node.js (guárdelo con extensión .bat
o .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));
Se puede hacer con muchos otros lenguajes como Ruby, Perl, Python, PHP y etc.
No hay forma de ejecutar un archivo aleatorio, a menos que sea un archivo binario ejecutable real. La función Windows CreateProcess () simplemente no está diseñada para ello. Los únicos archivos que puede ejecutar son aquellos con MZ
magic o con extensiones de la lista %PATHEXT%
.
Sin embargo, CMD tiene un soporte limitado para intérpretes personalizados a través de la cláusula EXTPROC
. La limitación es que el intérprete también debe admitir y omitir esta cláusula en su ejecución.
Sí, esto es posible utilizando la variable de entorno PATHEXT
. Que también se usa, por ejemplo, para registrar scripts .vbs
o .wsh
para que se ejecuten "directamente".
Primero necesita extender la variable PATHEXT
para que contenga la extensión de ese script de servicio (en el siguiente asumo que la extensión es .foo, ya que no conozco Node.js)
Los valores por defecto son algo como esto:
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
Debe cambiarlo (a través del Panel de control) para verse así:
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.FOO
El uso del panel de control (Panel de control -> Sistema -> Configuración avanzada del sistema -> Variables de entorno es necesario para mantener el valor de la variable PATHEXT).
Luego debe registrar el "intérprete" correcto con esa extensión utilizando los comandos FTYPE
y ASSOC
:
ASSOC .foo=FooScript
FTYPE FooScript=foorunner.exe %1 %*
(El ejemplo anterior se toma descaradamente de la ayuda proporcionada por ftype /?
)
ASSOC y FTYPE escribirán directamente en el registro, por lo que necesitará una cuenta administrativa para ejecutarlos.