2010-08-26 5 views
1

J'ai une question avec la commande batch "for" dans windows.Lecture des valeurs vides dans la commande "for" dans un fichier de commandes Windows

J'ai un fichier keys.txt qui contient cette ligne ..

clé, valeur, x86, Windows7

Je veux analyser cette ligne et stocker les 4 virgule des variables seperated en 4 variables. J'accomplis cela par le script de lot Windows suivant.

for /F "tokens=1,2,3,4* delims=," %%i 
in (keys.txt) do (

    echo first is %%i 

    echo second is %%j 

    echo third is %%k 

    echo fourth is %%l 

    echo rest is %%m 

    echo ------------- 

) 

Toutefois, lorsque i modifier le keys.txt à

clé, valeur ,, windows7

La troisième variable est imprimée comme windows7. Je m'attendrais à ce que la troisième variable soit vide et la quatrième variable à Windows7. Si je donne un espace entre les 2 virgule est comme ça

clé, valeur,, Windows7

Ensuite, il imprime la 3e variable vide et la variable 4 comme Windows7. Quelqu'un sait comment je peux faire en sorte que le cas précédent (c'est-à-dire celui qui n'a pas d'espace) fonctionne également correctement?

+0

Pourquoi utiliser batch pour analyser les fichiers? Avez-vous d'autres options? comme en utilisant un vrai analyseur de fichiers (langage)? Si vous ne pouvez pas télécharger et utiliser des choses, vous pouvez utiliser vbscript, qui est mieux à faire de tels travaux. – ghostdog74

+0

En fait, il y a beaucoup de code écrit en utilisant des scripts batch, donc ce serait une énorme tâche de migrer le tout vers vbs. Cependant, j'ai trouvé une autre alternative qui serait d'écrire un fichier vbs qui créerait un fichier avec une liste de lignes de var = valeur set, puis appelez ce fichier de commandes à partir du fichier batch parent. – Santhosh

Répondre

4

Essayez ceci. Idea fom here
Le script prétraite chaque ligne en affectant le texte # NUL # à chaque emplacement vide. Vous pouvez ignorer # NUL # valeurs après cela.

cls 
setlocal enabledelayedexpansion 
@echo off 
for /f "tokens=*" %%X in (keys.txt) do (
    set "work=%%X" 
    :: fill empty fields with "#NUL#" ... 
    :: but do it twice, just in case consecutive fields are empty 
    for /l %%i in (1,1,2) do set "work=!work:,,=,#NUL#,!" 
    for /F "tokens=1,2,3,4* delims=," %%i in ("!work!") do (
echo first is %%i 
echo second is %%j 
echo third is %%k 
echo fourth is %%l 
echo rest is %%m 
echo ------------- 
)) 

HTH

+0

Merci beaucoup !!! Cela fonctionne comme une brise! – Santhosh

Questions connexes