2014-07-13 5 views
0

J'ai des problèmes pour utiliser wmi dans une boucle for. J'essaie simplement de saisir le premier numéro de la version OS pour différencier XP (5) et Win7 (6).batch wmi pour la boucle

Ce qui suit fonctionne parfaitement pour interroger une seule machine.

for /f "tokens=1 delims=." %%a in ('wmic /node:%machine% os get version') do @for /f "tokens=1 delims=." %%b in ("%%a") do @set osver=%%b 
echo %osver% 

Cependant, une fois que je tente de le mettre dans une boucle, je suis seulement obtenir un blanc pour% osver%

for /f %%G in (list.txt) do (
    for /f "skip=2 tokens=2 delims=.," %%a in ('wmic /node:%%G os get version /format:csv') do @for /f "tokens=1 delims=." %%b in ("%%a") do @set osver=%%b 
    echo %osver% 
) > results.txt 

Je suppose que c'est un problème avec mon saut/jetons/mais je ne suis pas sûr de savoir exactement où ça va mal. Toute variation sur eux que j'ai essayé se traduit toujours par une ligne vide.

Répondre

0

Je dirais que vous vous trompez.

Dans une instruction de bloc (a parenthesised series of statements), le bloc entier est analysé et puis exécuté. Tout %var% dans le bloc sera remplacé par la valeur de cette variable au moment où le bloc est analysé - avant que le bloc est exécuté - la même chose s'applique à un FOR ... DO (block).

Par conséquent, IF (something) else (somethingelse) sera exécuté en utilisant au moment où le IF se rencontre les valeurs de %variables%.

Deux moyens communs pour surmonter ce sont 1) à utiliser setlocal enabledelayedexpansion et utiliser !var! en place de %var% pour accéder à la valeur modifiée de var ou 2) pour appeler un sous-programme pour effectuer un traitement ultérieur en utilisant les valeurs modifiées. Notez par conséquent l'utilisation de CALL ECHO %%var%% qui affiche la valeur modifiée de var. CALL ECHO %%errorlevel%% affiche, mais malheureusement, RESET errorlevel.

Donc, je prédis que call echo %%osver%% à la place de echo %osver% permettrait de résoudre votre problème.

OTOH, echo %%b serait probablement plus facile et plus rapide.


for /f %%G in (list.txt) do (
for /f "skip=2 tokens=2 delims=.," %%a in (
    'wmic /node:%%G os get version /format:csv' 
) do for /f "tokens=1 delims=." %%b in ("%%a") do (
    set osver=%%b 
    echo %%b 
) 
CALL echo %%osver%% 
) > results.txt 
0

Vous ne devez définir aussi %% b pour osver, si vous avez besoin de faire écho la valeur de %% b vous pouvez aussi bien l'écho %% b parce que lui-même, il est une variable Cette option n'est disponible que pour la méthode dans laquelle elle a été déclarée. Vous ne créez une variable d'instance que si vous envisagez de l'utiliser en dehors du corps.

Vous devriez donc vous en tenir à l'extension enabledelay si vous l'utilisez ailleurs ...

Vous devez également inclure vos instructions entre parenthèses pour éviter le code mélanger ....

+0

Comment echo %% b par lui-même? echo %% b apparaît comme% b – user3358058

+0

Vous écrivez %% b uniquement si vous travaillez à partir d'un fichier de commandes, et si% est précédé d'un seul si vous travaillez à partir de la ligne de commande. – mordecai

Questions connexes