2012-10-11 37 views
7

Estoy intentando reescribir un archivo de configuración usando un archivo por lotes de Windows. Estoy recorriendo las líneas del archivo y buscando la línea que quiero reemplazar con una nueva línea especificada.Eco de cadena con comillas dobles en el archivo de salida usando el lote de Windows

que tienen una 'función' que escribe la línea en el fichero de

:AddText %1 %2 
set Text=%~1% 
set NewLine=%~2% 
echo "%Text%" | findstr /C:"%markerstr%" 1>nul 
if errorlevel 1 (
    if not "%Text%" == "" (
     setlocal EnableDelayedExpansion 
     (
      echo !Text! 
    ) >> outfile.txt 
) else (
    echo. >> outfile.txt 
) 
) else (
    set NewLine=%NewLine"=% 
    setlocal EnableDelayedExpansion 
    (
     echo !NewLine! 
) >> outfile.txt 

) 
exit /b 

El problema es cuando% Texto% es una cadena con comillas dobles incrustadas. Luego falla. Posiblemente haya otros personajes que causarían que también fallara. ¿Cómo puedo obtener esto para poder trabajar con todo el texto encontrado en el archivo de configuración?

+0

Si quieres que funcione de forma fiable , no use lotes - use powershell o vbscript u otro lenguaje de scripting. –

+0

Eso sería genial, pero realmente no tengo eso como una opción. –

+0

En realidad, el problema parece ser qué comillas dobles incrustadas en el eco aquí: echo% Text% | findstr/C: "% markerstr%" 1> nul –

Respuesta

7

Intente reemplazar todo " en Text con ^".

^ es el carácter de escape por lo que el la " será tratado como carácter regular de

puede probar los siguientes:

:AddText %1 %2 
set _Text=%~1% 
set Text=%_Text:"=^^^"% 

... rest of your code 

REM for example if %1 is "blah"blah"blah" 
REM _Text will be blah"blah"blah 
REM Text will be blah^"blah^"blah 

Otros personajes que podrían causar que los errores (se puede resolver con los anteriores solución) son:

\ & | > <^
1

En una shell de lotes de Windows (comando) las comillas dobles son de escape con ^ en la línea de comandos estándar, pero con una doble comilla doble dentro de una cadena entre comillas dobles

echo Hello ^"Boy^" 
echo "Hello ""Boy""" 

(observación: segunda línea producirá el doble de presupuesto que rodea externa en la salida también)

Cuestiones relacionadas