Aacini me ganó a mi primera solución. Se puede mejorar agregando comillas para que la cadena pueda contener espacios y caracteres especiales y aun así dar el resultado correcto.
set "str=foo bar:biz bang:this & that"
for %%S in ("%str::=" "%") do echo %%~S
La solución tiene limitaciones:
- n * o? puede aparecer en la cadena
- Los problemas pueden surgir si la cadena ya contiene comillas ("), sobre todo si hay caracteres especiales, así
La segunda solución tiene una sintaxis extraña, pero el concepto es bastante sencillo. FOR/F con "cadena" se romperá en los caracteres de avance de línea - cada línea se procesará como su propia cadena. El truco es reemplazar el delimitador :
con un carácter de avance de línea. Tenga en cuenta que la línea en blanco en la solución a continuación es una parte crítica de El reemplazo complicado. Además, la siguiente línea debe comenzar con el !
que finaliza la expansión de la variable retrasada. No debe haber espacios iniciales.
La otra cosa de la que preocuparse es la molesta opción FOR/F "EOL". No queremos omitir ningún valor que comience por defecto con el carácter EOL que es ;
. Como hemos eliminado el delimitador de cadena :
, podemos usarlo como EOL.
Finalmente, necesitamos usar la expansión retardada, pero !
se dañará durante la expansión %% S si no deshabilitamos primero la expansión retardada dentro del ciclo.
set "str=foo bar:biz bang:this & that "^& the other thing!":;How does this work?"
setlocal enableDelayedExpansion
set ^"str=!str::=^
!"
for /f "eol=: delims=" %%S in ("!str!") do (
if "!!"=="" endlocal
echo %%S
)
Creo que esta técnica puede manejar casi cualquier cosa que le arroje.
jeb fue el primero en mostrarme cómo trabajar con las alimentaciones de línea en lote, y especialmente cómo usar esta técnica. Incluso puede publicarse en otro lugar en SO.
+1 mucho más fácil! –