2011-10-10 16 views

Respuesta

7

probar este

echo off 
setlocal 
FOR /F "tokens=3,* delims=.=" %%G IN (test.properties) DO (set %%G=%%H) 

rem now use below vars 
if "%%G"=="file" 
set lfile=%%H 
if "%%G"=="path" 
set lpath=%%H 
if "%%G"=="extension" 
set lextention=%%H 
echo %path% 

endlocal 
+2

no funciona para mí! –

19
For /F "tokens=1* delims==" %%A IN (test.properties) DO (
    IF "%%A"=="file" set file=%%B 
) 

echo "%file%" 

esperanza que esto podría ayudar a

16
@echo off 
FOR /F "tokens=1,2 delims==" %%G IN (test.properties) DO (set %%G=%%H) 
echo %file% 
echo %extension% 
echo %path% 

Tenga en cuenta que no hay espacio después de %% H. De lo contrario, esto ocasiona que se agregue un espacio, por ejemplo, rutas de archivos, y provocará errores de archivos no encontrados cuando las variables de los archivos de propiedades se utilizan como parte de una ruta de archivo. ¡Dispersado durante horas debido a esto!

+0

Sin embargo, no tendrá en cuenta los comentarios; +1 por solución. –

4

Una solución con soporte para comentarios (estilo #). Ver los comentarios en el código para una explicación.

test.properties:

# some comment with = char, empty line below 

#invalid.property=1 
some.property=2 
some.property=3 
# not sure if this is supported by .properties syntax 
text=asd=f 

propiedades-read.bat:

@echo off 

rem eol stops comments from being parsed 
rem otherwise split lines at the = char into two tokens 
for /F "eol=# delims== tokens=1,*" %%a in (test.properties) do (

    rem proper lines have both a and b set 
    rem if okay, assign property to some kind of namespace 
    rem so some.property becomes test.some.property in batch-land 
    if NOT "%%a"=="" if NOT "%%b"=="" set test.%%a=%%b 
) 

rem debug namespace test. 
set test. 

rem do something useful with your vars 

rem cleanup namespace test. 
rem nul redirection stops error output if no test. var is set 
for /F "tokens=1 delims==" %%v in ('set test. 2^>nul') do (
    set %%v= 
) 

salida de set test. (ver arriba):

test.some.property=3 
test.text=asd=f 

Las partes más importantes son:

  • los for -loop con la opción eol y delims y
  • los if se utiliza para comprobar que ambas variables %%a y %%b están ajustadas.

Lo que haces en el for -loop con la variable y su valor depende de ti - la asignación a algunas variables prefijadas fue solo un ejemplo. El enfoque de espacio de nombres evita que cualquier otra variable global quede anulada. Por ejemplo, si tiene algo como appdata definido en su archivo .properties.

Estoy usando esto para deshacerme de un config.bat adicional y en su lugar usar un archivo .properties tanto para la aplicación Java como para algunos archivos por lotes compatibles.

Funciona para mí, pero ciertamente no todos los casos extremos están cubiertos aquí, ¡así que las mejoras son bienvenidas!

0

Sé que esta es una publicación antigua, pero me gustaría ampliar la gran respuesta de toschug.

Si la ruta en.archivo de propiedades se definiría como% ~ dp0 o cualquier otra variable que debe ser ampliado primero antes de usarlo, recomiendo hacerlo de la siguiente manera:

En el archivo .properties:

path=%~dp0 

En el lote presenta a continuación, puede utilizar la siguiente manera (el código se va a utilizar entre los dos para (s) que define una < => limpieza de uno):

if "!test.path!" NEQ "" (
    echo Not expanded path: !test.path! 
    call :expand !test.path! test.path 
) 

echo test.path expanded: !test.path! 
pause 

:expand 
SET "%~2=%~1" 
GOTO :EOF 

no se olvide de usar (al inicio de el archivo por lotes):

SETLOCAL ENABLEDELAYEDEXPANSION 
Cuestiones relacionadas