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:\\|:\\|
7 Réponses :
Selon http://ss64.com/nt/for_f.html P >
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. P> blockQuote>
Il semble donc que WMIC et ne jouent pas bien ensemble. P>
Dans ce cas, la dernière itération ne produit pas un élément vide, et vous obtenez votre sortie de C'est parce que le dernier élément est un seul Vous pouvez éviter cela, en utilisant l'expansion en pourcentage pour les supprimer p> c | d | e || code> uniquement avec
echo% Disk_Databases% code>, < BR>
Mais
echo! Disk_Databases! code> va produire
|| d | e | code> ??
Et
Wow, nous vivons et apprenons, n'est-ce pas? Je me demande pourquoi un utilitaire comme WMIC produirait un seul caractère
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.
J'ai découvert une méthode plus efficace et plus fiable pour éliminer le 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 La solution consiste simplement à transmettre chaque ligne à travers une autre pour / f: -) p> < PRE> XXX PRE> 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 indésirable
"Ceci" et l'autre code>. Mais cette méthode n'a aucun problème avec une telle chaîne. P> p>
Bonne idée d'utiliser pour / f code> pour cela, normalement, j'ai trouvé ce comportement ennuyeux, mais dans ce cas, c'est utile.
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
Exécuter la commande suivante:
field=value
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 (
C'est une bonne réponse à l'OMI, n'exige pas une expansion retardée: Appel, ou imbriqué des boucles. Facile et simple!
Ajouter p> ^ | FindStr. code> et vous n'obtiendrez que des lignes vides