windows batch-file escaping

windows - Caracteres especiales en archivo por lotes



batch-file escaping (1)

Los caracteres especiales en los archivos por lotes son una molestia, pero no he encontrado la solución adecuada para escapar correctamente de los dos primeros caracteres de esta cadena en particular. Estoy tratando de pasar la aplicación.

SET pass=^&AntiBatchfileString A_Program.exe /pass=%pass%

Cosas que he probado:

:: Escaping the escape twice, first for ^, second for &. SET pass=^^^^&AntiBatchfileString echo %pass% :: Combining escapes. SET first=^^ SET second=^^&AntiBatchfileString SET pass=%first%%second% echo %pass% :: Preventing expansion SET first=^^ SET second=^^&AntiBatchfileString SET pass=!first!%second% echo %pass% :: I got this to print correctly SET "pass=^&AntiBatchfileString" echo ^^%pass%

Aún así, al pasar el último, no acepta el inicio de sesión, no sé cuál es el resultado final. Eso me hizo pensar que tal vez estaba tratando de hacer otra expansión al pasar el parámetro a la aplicación, así que también lo cité.

SET "pass=^&AntiBatchfileString" A_Program.exe "/pass=^^%pass%"

Todavía no funciona, no estoy seguro de lo que me falta en este momento.


Suponiendo que quiere la cadena ^&AntiBatchfileString literalmente, esta es la mejor sintaxis set , ya que la mayoría de los caracteres especiales ( ^ & ( ) < > | y también los delimitadores estándar ; = PESTAÑA DE ESPACIO ) pierden su significado particular tan pronto como se colocan en entre "" y el "" sí no se convierten en parte del valor variable:

set "pass=^&AntiBatchfileString"

Esto funciona solo mientras las extensiones de comando estén activadas, que es el valor predeterminado de Windows de todos modos (escriba cmd /? Y vea la opción /E ).

Al expandir (leer) una variable como "%pass%" (con "" ), los caracteres especiales aún se tratan literalmente.

Sin embargo, tan pronto como lo expande como %pass% (no "" ), recuperan su significado especial. Entonces tienes las siguientes opciones:

  1. Use set "pass=^^^&AntiBatchfileString" , donde ^^ escapa al literal ^ y ^& el literal & al leer como %pass% .
  2. Habilite la expansión retrasada (vea set /? Sobre cómo funciona y setlocal /? O cmd /? Sobre cómo habilitarlo), donde el valor de la variable se expande (lee) en un momento en el que el análisis de caracteres especiales ya se ha completado .

Prefiero el último enfoque, porque no es necesario un escape especial, y también puede tratar con " aparecer en el valor de la cadena (incluso si está presente asimétricamente).
Por cierto, " también se puede escapar por ^" , siempre que esto no aparezca dentro de "" sin escape "" .

Sin embargo, los signos % no pueden escaparse como ^% en un archivo por lotes, porque la expansión porcentual ocurre antes del escape, pero debe duplicarlos como %% para obtener uno literal cada uno, independientemente de si la cadena está o no entre "" .
Tenga en cuenta que en la consola, %% no funciona.

Finalmente, literal ! son consumidos por la función de expansión retrasada cuando está habilitada, por lo tanto, debe prestar especial atención a aquellos en caso de que escapen de ellos como ^! , o también alternando inteligentemente la expansión retardada (por lo tanto, para habilitarla solo cuando realmente se necesita y para deshabilitarla de otro modo, cuando se proporciona una cadena literal, como en una línea de comando set , por ejemplo, al expandir una variable estándar como %pass% y al leer una variable como %%I (archivo por lotes) o %I (consola), por ejemplo). Por supuesto, esta tampoco es la solución definitiva, porque necesita setlocal y endlocal para habilitar / deshabilitar la expansión retrasada, que están destinadas a localizar cambios en el entorno, por lo que cualquier cambio de variable ya que el comando setlocal más reciente se pierde tan pronto como se ejecuta endlocal ( Sin embargo, hay algunos trucos para pasar un valor variable sobre la barrera endlocal ).