Pourquoi le FOR /f en boucle en ce script de commandes de l'évaluation d'une ligne vide?
Je suis en train d'écrire un script batch qui obtient (entre autres choses) une liste de tous les disques durs de l'ordinateur. Le code de base ressemble à quelque chose comme ceci:
REM Build the list of disk drives to monitor
SETLOCAL enabledelayedexpansion
FOR /f "skip=1 tokens=1 delims=:" %%a in ('"WMIC logicaldisk WHERE drivetype=3 GET deviceid"') do (
SET "DISK_DATABASES=!DISK_DATABASES!%%a|"
SET "DRIVES_TO_MONITOR=!DRIVES_TO_MONITOR!%%a:\\|"
)
J'ai assez de toute évidence la construction de deux listes légèrement différents formats pour une utilisation ultérieure. Lorsque je l'exécute, cependant, la sortie j'obtiens ressemble à quelque chose comme ceci:
C|D|E||
C:\\|D:\\|E:\\|:\\|
Maintenant, j'attends la fuite pipe dans les deux cas, et je peux gérer ça, mais je suis vraiment confus pourquoi il y a un extra vierge d'entrée. Si je lance le wmic
commande manuellement, je peux voir qu'il y a en effet une ligne vide à la fin de la sortie, mais ma compréhension est que /f
était précisément censé ignorer les lignes vides.
Si je tourne ECHO
, il semble que la dernière ligne est tout comme un retour chariot/saut de ligne ou similaire. Est-il un moyen de faire ce que j'attends? Ai-je raté quelque chose? J'ai essayé d'écrire un if
condition dans la boucle d'exclure cette dernière ligne, mais c'était... funky et n'a jamais fonctionné. J'apprécie tous les/tous vous aider.
OriginalL'auteur Morinar | 2011-11-04
Vous devez vous connecter pour publier un commentaire.
Dans ce cas, la dernière itération produit pas un item vide, et vous obtenez votre sortie de
C|D|E||
seulement avececho %DISK_DATABASES%
,mais
echo !DISK_DATABASES!
sortie||D|E|
??C'est parce que le dernier élément est un simple
<CR>
caractère.Et
<CR>
personnages sont directement supprimés après le pourcentage d'expansion, mais pas à l'expansion retardée.Vous pouvez éviter cela en utilisant le pourcentage d'expansion pour les supprimer
<CR>
de caractères sur une ligne de la première place... Ou peut-être que c'est le résultat de ce @matt a trouvé.Je suppose que ce n'est pas l'unicode problème, même sous XP, Microsoft n'est pas de savoir comment leurs propres fins de ligne devrait être. IPconfig (XP) produit également inconstent les fins de ligne
Grâce à jeb et mat pour les réponses. Les deux solutions ont fonctionné, mais de jeb n'a pas besoin de moi pour créer des fichiers temporaires, donc je suis à accepter ses.
OriginalL'auteur jeb
Je viens de tomber sur ce sujet. J'ai été en utilisant findstr /v pour exclure des lignes vides:
beaucoup mieux en effet, merci dimitri
OriginalL'auteur dmitry
Selon http://ss64.com/nt/for_f.html
Il semble donc que WMIC et POUR ne pas jouer bien ensemble.
OriginalL'auteur matt
J'ai découvert une façon plus efficace et plus fiable méthode à la bande indésirables
<CR>
à partir de la fin de chaque ligne. Aucun fichier temporaire, et qu'aucun APPEL n'est nécessaire.Je ne comprends pas le mécanisme de comment FOR /F convertit le WMIC unicode sortie en ASCII. Normalement POUR /F ne peut pas lire le format unicode. Mais cependant il fonctionne, chaque converti ligne se termine avec
<CR><CR><LF>
. FOR /F sauts de lignes à chaque<LF>
, et puis si le dernier caractère de la ligne est<CR>
il supprime la dernière<CR>
, dans ce cas, laissant derrière les indésirables<CR>
.La solution est tout simplement de passer chaque ligne par un plus POUR l' /F 🙂
Cette méthode est plus fiable, d'utilisation normale de l'expansion parce que vous n'avez pas à vous soucier de citer ou d'échapper les caractères spéciaux. Par exemple, L'APPEL de la méthode qui utilise la normale expansion ne peut pas gérer une chaîne comme
"this & that" & the other
. Mais cette méthode n'a aucun problème avec une chaîne.for/f
pour cela, normalement j'ai trouvé ce comportement gênant, mais dans ce cas il est utile.OriginalL'auteur dbenham
Mon niveau de langage pour éviter cela est d'écrire la sortie de WMIC à un fichier temporaire, puis le TYPE d'utilisation (ce qui réduit UTF16 ASCII) pour se nourrir que POUR, comme ceci:
OriginalL'auteur flabdablet
Exécutez la commande suivante:
Sortie sera:
Noter qu'il n'y aura pas de lignes supplémentaires.
OriginalL'auteur David Lang
Ajouter
^| findstr .
et vous obtiendrez non seulement des lignes videsOriginalL'auteur André Pires