2017-08-10 2 views
0

ici est la question que je ne comprends pasDifférence de sortie wmic en cmd et batch ..why?

j'exécuter la commande suivante dans cmd (win7):

>wmic netuse where "LocalName="Z:"" get UserName /value 

La sortie est merveilleux comme suit:

UserName=ASI\kote 

(il y a 2-3 lignes vides en haut et en bas de cette sortie de commande qui ne peut pas être affichée en format tapé ici)

Maintenant, je veux exécuter cette commande dans un script batch et obtenir sa sortie. Donc, voici mon code simple lot pour le même:

@setlocal EnableDelayedExpansion 
@echo off 
for /f "tokens=1,2,3,4,5,6,7,8 delims=," %%a in ("X:,Y:,Z:") do (
    echo %%a,%%b,%%c 
    set currDrive=%%c 
    echo wmic netuse where "LocalName="!currDrive!"" get UserName /value 
    for /f "tokens=1,2,3,4,5,6,7,8 delims=*" %%a in ('wmic netuse where "LocalName="!currDrive!"" get UserName ^/value') do (
     echo %%a,%%b,"%%c" 
     if "%%a"=="UserName" (
      set mappedDriveUser=%%c 
      echo ===="mappedDriveUser!" 
      echo org"%%c" 
      rem set mappedDriveUser=!mappedDriveUser:^ =! 
      rem echo ====!mappedDriveUser! 
      rem echo Drive !currDrive! is connected through user !mappedDriveUser! 
     ) else (
      rem donothing 
     ) 
    ) 
) 
echo end 

Voici la sortie du lot que je reçois:

X:,Y:,Z: 
wmic netuse where "LocalName="Z:"" get UserName /value 
,,"" 
,,"" 
,,""Name=ASI\kote 
,,"" 
,,"" 
,,"" 
end 

La sortie des opérations par lot utilisateur est disparu et var réelle sort de « » . Je crois qu'il devrait venir à l'intérieur des guillemets Je dois comprendre la même chose. En outre, j'ai besoin de conseils pour obtenir la sortie wmic cmd 'correcte' dans le script batch - ce qui est ce que je reçois quand j'exécute la commande dans le terminal cmd. Thnks à l'avance

+0

PS: Ces disques sont mis en correspondance des lecteurs de un endroit éloigné sur mon PC – Abhi

+0

je préfère utiliser ce type de structure 'In ('" WMIC NETUSE Où (LocalName = 'currDrive') Obtenez UserName/valeur! "') Do'. – Compo

Répondre

2

La sortie de la commande wmic, avec interrupteur de /valueget est quelque chose comme (avec des lignes vides supplémentaires)

UserName=Where\Who 

Si nous utilisons les for /f options pour tokenizer la chaîne en utilisant la = comme séparateur pour séparer le nom de champ (jeton 1) de sa valeur (jeton 2) et traiter uniquement les lignes avec des données dans le second jeton, alors nous pouvons écrire quelque chose comme

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for %%d in (f: g: h:) do (
     for /f "tokens=1,* delims==" %%a in (' 
      wmic netuse where "localname='%%d'" get username ^/value 
     ') do if not "%%b"=="" (
      echo Drive %%d mapped through %%b 
     ) 
    ) 

Il n'y a pas besoin pour stocker les valeurs à l'intérieur des for paramètres remplaçables dans des variables si vous ne les utilisez pas ultérieurement, utilisez directement le paramètre remplaçable

note: valeurs extraites de la contiennent habituellement sortie wmic un retour de chariot de fin. Une commande supplémentaire for peut être nécessaire pour le supprimer si nécessaire.

Ce code (presque le même, juste [] ajouté)

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for %%d in (f: g: h:) do (
     for /f "tokens=1,* delims==" %%a in (' 
      wmic netuse where "localname='%%d'" get username ^/value 
     ') do if not "%%b"=="" (
      echo Drive %%d mapped through [%%b] 
     ) 
    ) 

va générer, montrant le retour chariot supplémentaire

]rive f: mapped through [.CN=myUserName.OU=X01.O=X 
]rive g: mapped through [.CN=myUserName.OU=X01.O=X 
]rive h: mapped through [.CN=myUserName.OU=X01.O=X 

Cela peut être manipulé avec quelque chose comme (voir la boucle for supplémentaire)

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for %%d in (f: g: h:) do (
     for /f "tokens=1,* delims==" %%a in (' 
      wmic netuse where "localname='%%d'" get username ^/value 
     ') do if not "%%b"=="" for /f "delims=" %%c in ("%%b") do (
      echo Drive %%d mapped through [%%c] 
     ) 
    ) 

générant

Drive f: mapped through [.CN=myUserName.OU=X01.O=X] 
Drive g: mapped through [.CN=myUserName.OU=X01.O=X] 
Drive h: mapped through [.CN=myUserName.OU=X01.O=X] 
+1

J'ai examiné le problème de retour de chariot avec un débogueur. Il s'avère que wmic imprime par erreur des lignes qui ont déjà des fins de ligne CRLF vers un flux en mode texte C, qui convertit LF en CRLF. Cela entraîne des chaînes qui se terminent par CRCRLF. L'extraction du CRLF final - comme le fait une boucle 'for/f' - laisse toujours un retour chariot. – eryksun

+0

@eryksun, merci, réponse mise à jour. Comme vous pouvez le voir, le 'for/f' peut supprimer le CR. –

+0

Bien sûr. Peut-être qu'un jour Microsoft corrigera ce bug dans wmic. Il devrait imprimer des chaînes avec des fins de ligne LF, et laisser la traduction au CRLF jusqu'au flux stdio. – eryksun