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:
-
Use
set "pass=^^^&AntiBatchfileString"
, donde^^
escapa al literal^
y^&
el literal&
al leer como%pass%
. -
Habilite la expansión retrasada (vea
set /?
Sobre cómo funciona ysetlocal /?
Ocmd /?
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
).