2012-09-27 13 views
9

tengo la siguiente cadena:cadena de análisis en el archivo por lotes

MyProject/Architecture=32bit,BuildType=Debug,OS=winpc

Me gustaría ser capaz de agarrar el de 32 bits valores, depuración y, WinPC y almacenarlos en variables con nombre Arquitectura, buildtype, y OS para hacer referencia más adelante en el script por lotes. Normalmente soy un chico de Unix, así que este es un nuevo territorio para mí. ¡Cualquier ayuda sería muy apreciada!

Respuesta

24

Esto debe hacerlo:

FOR /F "tokens=1-6 delims==," %%I IN ("MyProject/Architecture=32bit,BuildType=Debug,OS=winpc") DO (
    ECHO I %%I, J %%J, K %%K, L %%L, M %%M, N %%N 
) 
REM output is: I MyProject/Architecture, J 32bit, K BuildType, L Debug, M OS, N winpc 

El lote FOR bucle es una pieza muy interesante de la maquinaria. Escriba FOR /? en una consola para una descripción de algunas de las locuras que puede hacer.

+0

16 segundos, y mucho más limpio! Me he quedado sin votos para hoy, tan imaginario +1 por ahora; de vuelta con un voto real después. – LittleBobbyTables

3

intente lo siguiente:

@ECHO OFF 

SET Var=MyProject/Architecture=32bit,BuildType=Debug,OS=winpc 

FOR /F "tokens=1,2,3 delims=," %%A IN ("%Var%") DO (
    FOR /F "tokens=1,2 delims==" %%D IN ("%%A") DO (
     SET Architecture=%%E 
    ) 
    FOR /F "tokens=1,2 delims==" %%D IN ("%%B") DO (
     SET BuildType=%%E 
    ) 
    FOR /F "tokens=1,2 delims==" %%D IN ("%%C") DO (
     SET OS=%%E 
    ) 
) 

ECHO %Architecture% 
ECHO %BuildType% 
ECHO %OS% 

PAUSE 
+4

Solo por diversión, considere reemplazar los tres bucles "FOR" internos con la única línea "SET %% A & SET %% B & SET %% C". Gran nombre por cierto. –

5

Aquí es una solución interesante que no le importa cuántos o qué pedir el nombre = valor pares se especifican. El truco es reemplazar cada coma con un carácter de avance de línea para que FOR/F repita cada par de nombre = valor. Esto debería funcionar siempre y cuando solo haya un / en la cadena.

@echo off 
setlocal enableDelayedExpansion 
set "str=MyProject/Architecture=32bit,BuildType=Debug,OS=winpc" 

::Eliminate the leading project info 
set "str=%str:*/=%" 

::Define a variable containing a LineFeed character 
set LF=^ 


::The above 2 empty lines are critical - do not remove 

::Parse and set the values 
for %%A in ("!LF!") do (
    for /f "eol== tokens=1,2 delims==" %%B in ("!str:,=%%~A!") do set "%%B=%%C" 
) 

::Display the values 
echo Architecture=%Architecture% 
echo BuildType=%BuildType% 
echo OS=%OS% 

Con un poco más de código se puede analizar de forma selectiva a cabo sólo pares nombre = valor que nos interesa. También inicializa las variables a indefinido en caso de que la variable no se encuentra en la cadena.

@echo off 
setlocal enableDelayedExpansion 
set "str=MyProject/Architecture=32bit,BuildType=Debug,OS=winpc" 

::Eliminate the leading project info 
set "str=%str:*/=%" 

::Define a variable containing a LineFeed character 
set LF=^ 


::The above 2 empty lines are critical - do not remove 

::Define the variables we are interested in 
set "vars=Architecture BuildType OS" 

::Clear any existing values 
for %%A in (%vars%) do set "%%A=" 

::Set the values 
for %%A in ("!LF!") do (
    for /f "eol== tokens=1,2 delims==" %%B in ("!str:,=%%~A!") do (
    for %%D in (%vars%) do if "%%B"=="%%D" set "%%B=%%C" 
) 
) 

::Display the values 
for %%A in (%vars%) do echo %%A=!%%A! 
+0

Esto se ve increíble e incomprensible. Me encantaría más detalles sobre "% str =% str: */=%" y "! Str:, = %% ~ A!". El primero no tiene sentido por qué hay un '=' al final, el segundo tiene un misterio ~ en él. – Kieveli

+0

Funciona para conjuntos más pequeños de datos, pero estoy consultando una lista de 24k elementos ahora, y la asignación de un resultado de comando parece ser más larga que la longitud máxima permitida para las variables de archivo por lotes. – Kieveli

+1

@Kieveli - Sí, las variables de entorno utilizadas por CMD.EXE están limitadas a una longitud máxima de aproximadamente 8191 bytes de longitud. – dbenham

Cuestiones relacionadas