2017-08-10 48 views
0

這裏是我不明白wmic輸出差異cmd和批次..爲什麼?

我在cmd中執行以下命令的問題(WIN7):

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

輸出是美好如下:

UserName=ASI\kote 

(有在這個命令輸出的頂部和底部有2-3條空白行,這裏不能以類型格式顯示)

現在,我想運行這個命令在批處理腳本並獲取其輸出。因此,這裏是我的一樣簡單的批處理代碼:

@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 

這裏是批量輸出我得到:

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

批處理輸出的變化,用戶消失了,實際VAR是走出來的「」 。我相信它應該進入雙引號 我需要了解相同。 此外,我需要提示,以批處理腳本獲取'正確的'wmic cmd輸出 - 這是我在cmd終端中運行命令時所得到的結果。 Thnks預先

+0

PS:這些驅動器在我的電腦 – Abhi

+0

上映射的一些位置偏遠的驅動我更喜歡使用這種類型的結構'在('「WMIC NetUse凡(的localName =‘currDrive’)獲取用戶名/值! 「')做'。 – Compo

回答

2

wmic命令的輸出,與get/value開關是一樣的東西(用另外的空行)

UserName=Where\Who 

如果我們使用for /f選項來標記使用=字符串作爲用於將字段名稱(標記1)與其值(標記2)分開並且僅處理具有第二標記中的數據的行的分隔符,那麼我們可以寫出類似於

@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 
     ) 
    ) 

沒有任何需要for更換裏面的參數值存儲到變量,如果你沒有在以後使用它們,直接用替換參數

:從wmic輸出檢索到的值通常含有結束回車。必要時可能需要額外的for命令來放棄它。

此代碼(幾乎是相同的,只是[]加)

@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] 
     ) 
    ) 

會產生,表現出額外的回車

]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 

這可以用類似處理(見額外for環)

@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] 
     ) 
    ) 

生成

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

我用調試器查看回車問題。事實證明,wmic錯誤地將已經具有CRLF行尾的行打印到C文本模式流,該流將LF轉換爲CRLF。這導致以CRCRLF結尾的字符串。剝離尾隨的CRLF - 作爲'for/f'循環的做法 - 仍然會導致尾隨的回車。 – eryksun

+0

@eryksun,謝謝,回答更新。正如你所看到的,'for/f'可以刪除CR。 –

+0

當然。也許有一天微軟會在wmic中修復這個bug。它應該打印帶有LF行結尾的字符串,並將翻譯保留到CRLF直到stdio流。 – eryksun