2011-03-08 34 views
6

Tengo un archivo por lotes que necesita pasar un parámetro que incluirá tuberías y espacios. Debido a los espacios, se deben unir dos comillas al parámetro al pasarlo. Necesito quitar esas comillas dobles y repetir el parámetro. Normalmente, usar ~ me permitiría hacer esto, pero creo que algo sobre los parámetros específicos que estoy pasando causa un problema. Si hago esto:Parámetro del archivo por lotes con espacios, comillas dobles, tuberías

[Test1.bat]

call test2.bat "Account|Access Level|Description" 

[test2.bat]

echo %1 
echo %~1 

Y corre Test1.bat, me sale esta salida:

"Account|Access Level|Description" 
'Access' is not recognized as an internal or external command, operable program or batch file. 

Entonces, ¿cómo elimino las comillas dobles y sigo teniendo una variable utilizable?

Respuesta

3

Puede usar la expansión retardada, ya que no le preocupan los caracteres especiales.
El único problema es obtener el contenido del parámetro en una variable, ya que solo se puede transferir a través de una expansión porcentual.
Pero en su caso esto debería funcionar.

@echo off 
setlocal DisableDelayedExpansion 
set "str=%~1" 
setlocal EnableDelayedExpansion 
echo !str! 

Observación, deshabilito primero la expansión retardada, entonces la! y^no se modifican por la expansión del 1%

EDIT: La expansión retardada se puede activar o desactivar con

setlocal DisableDelayedExpansion 
setlocal EnableDelayedExpansion 

Si está activado, se añade otra forma de variables que se extienden (en lugar de !variable!%variable%), primario para evitar el efecto de bloqueo de paréntesis de variables (descrito en set /?).

Pero la expansión con !variable! también impide el contenido de cualquier análisis posterior, porque la expansión retrasada es la última fase del análisis de líneas de proceso por lotes.
En detalle se explica en how does the windows command interpreter cmd exe parse scripts

+0

¡funcionó! ¡Muchas gracias! ¿Puedes decirme por qué funcionó? ¿Qué estoy haciendo cuando desactivo o activo la "expansión demorada"? – SuperNES

+0

@SuperNES: edito mi publicación para explicarlo un poco – jeb

+0

¿Cómo pasarías una comilla doble simple en esto? Cada vez que trato de llamar a un archivo por lotes citando como '. \ Blah.cmd" asdf "" 123 "' the 'echo! Str!' Da como resultado dos comillas dobles en lugar de una. – binki

1
@echo off 
if "%~2"=="" (
    call %0 "Account|Access Level|Description" dummy 
) ELSE (
    setlocal ENABLEEXTENSIONS 
    for /F "tokens=*" %%A IN ("%~1") DO @echo.%%A 
) 

No exactamente bonito, pero funciona. Tratar con caracteres especiales siempre es una molestia en los archivos por lotes ...

+0

¿Cómo se puede pasar una comilla doble literal en esto? Cuando intento (por '. \ Play2.cmd" a b "" cummy) 'recibo dos comillas dobles repetidas en vez de 1. – binki

Cuestiones relacionadas