8
votes

Pourquoi la boucle FOR / F dans ce script de lot évaluait-elle une ligne vierge?

J'essaie d'écrire un script de lot qui obtient (entre autres) une liste de tous les lecteurs de disque à l'ordinateur. Le code de base ressemble à ceci:

C|D|E||
C:\\|D:\\|E:\\|:\\|


0 commentaires

7 Réponses :


4
votes

Selon http://ss64.com/nt/for_f.html

Beaucoup de fichiers texte de sortie de commandes et utilitaires (E.G. WMIC) au format Unicode, ceux-ci ne peuvent pas être lus par la commande pour l'ASCII. Pour convertir le format de fichier, utilisez la commande Type.

Il semble donc que WMIC et ne jouent pas bien ensemble.


0 commentaires

5
votes

Dans ce cas, la dernière itération ne produit pas un élément vide, et vous obtenez votre sortie de c | d | e || uniquement avec echo% Disk_Databases% , < BR> Mais echo! Disk_Databases! va produire || d | e | ??

C'est parce que le dernier élément est un seul caractère.
Et sont directement supprimés après l'expansion de pourcentage, mais pas avec une expansion retardée.

Vous pouvez éviter cela, en utilisant l'expansion en pourcentage pour les supprimer xxx


3 commentaires

Wow, nous vivons et apprenons, n'est-ce pas? Je me demande pourquoi un utilitaire comme WMIC produirait un seul caractère sur une ligne en première place ... ou peut-être que c'est le résultat de ce que @matt a découvert.


Je suppose que ce n'est pas le problème Unicode, car même dans XP Microsoft ne savait pas comment leurs propres fins de ligne devraient être. Ipconfig (XP) produit également des terminaisons de ligne inconsententes


Merci à la Jeb et à Matt pour les réponses. Les deux solutions fonctionnaient, mais je ne me demandais pas de créer des fichiers temporaires, alors j'accepte son.



4
votes

J'ai découvert une méthode plus efficace et plus fiable pour éliminer le indésirable à partir de la fin de chaque ligne. Aucun fichier temporaire, et aucun appel requis.

Je ne comprends pas le mécanisme de la manière pour / f convertit la sortie WMIC Unicode en ASCII. Normalement pour / f Impossible de lire Unicode. Mais cependant, cela fonctionne, chaque ligne convertie se termine par . Pour / f rompt des lignes à chaque , puis si le dernier caractère de la ligne est il bande ce dernier , dans ce cas, laissant derrière le .

La solution consiste simplement à transmettre chaque ligne à travers une autre pour / f: -) < PRE> XXX

Cette méthode est plus fiable, puis en utilisant une expansion normale car vous n'avez pas à vous soucier de cibler ou d'échapper à des caractères spéciaux. Par exemple, la méthode d'appel utilisant une expansion normale ne peut pas gérer une chaîne comme "Ceci" et l'autre . Mais cette méthode n'a aucun problème avec une telle chaîne.


1 commentaires

Bonne idée d'utiliser pour / f pour cela, normalement, j'ai trouvé ce comportement ennuyeux, mais dans ce cas, c'est utile.



0
votes

Mon idiome standard pour traiter avec ceci consiste à écrire la sortie de WMIC à un fichier TEMP, puis à utiliser le type (qui réduit l'UTF16 à ASCII) pour alimenter cela, comme ceci:

:: Standard environment setup
setlocal enabledelayedexpansion
:: Every variable whose name starts with "tf" will identify a temporary
:: file - remove any such variables inherited from the parent environment
for /f %%V in ('set tf') do set %%V=
:: Create some temporary filenames. Prefix all of them with this script's
:: own name to avoid clashes with those owned by other scripts.
for /l %%I in (1,1,4) set tf%%I="%temp%\%~n0-temp%%I.txt"

:: Use temp file to work around coding mismatch between WMIC out and FOR in
wmic product where "name like 'Microsoft Office %% 2010'" get packagecache >!tf1!
for /f "skip=1" %%P in ('type !tf1!') do if exist "%%~P" msiexec /x "%%~P" /passive /norestart

:: Before quitting script, clean up temporary files
for /f %%V in ('set tf') do if exist "%%~V" del /f /q "%%~V"
endlocal


0 commentaires

0
votes

Exécuter la commande suivante:

field=value


0 commentaires

12
votes

Je viens de venir sur ce sujet. J'utilise FindStr / V pour exclure les lignes vides:

FOR /f "usebackq skip=1 tokens=1 delims=:" %%a in (`WMIC logicaldisk WHERE "drivetype=3" GET deviceid ^| findstr /v /r "^$"`) do (


1 commentaires

C'est une bonne réponse à l'OMI, n'exige pas une expansion retardée: Appel, ou imbriqué des boucles. Facile et simple!



1
votes

Ajouter ^ | FindStr. et vous n'obtiendrez que des lignes vides

xxx


0 commentaires