2016-11-29 35 views
3

爲了得到當前批次駐留在驅動器很容易使用如何檢查當前驅動器是否位於本地磁盤(cmd)上?

set batchdrive=%~d0 

但怎麼可能檢查%batchdrive%是一個本地驅動器上,而不是在(映射)網絡共享?

檢查%SYSTEMDRIVE%或固定列表「C:」「D:」...不可靠。

+0

'wmic LogicalDisk其中(DeviceID =「%〜d0」AND DriveType = 3)獲取DeviceID'(如果驅動器不是本地的則返回錯誤) – aschipfl

回答

0

要檢查的第一件事是,如果batchdrive未映射的網絡共享(,出現這種情況,如果你開始的cmd.exe外的批處理文件,例如通過雙擊或通過系統調用):

if "%batchdrive%" == "\\" set nshare=1 

第二件事是檢查batchdrive是否在網絡共享列表中。這些被示出具有net use,因此,我們過濾輸出爲看起來像與findstr /r /c:" [A-Z]: "的磁盤驅動器,並通過for /f "tokens=2"接過輸出的第二部分的所有行,其輸出類似於

status  local remote    network 
------------------------------------------------------------------- 
OK   D:  \\computer1\share1 Microsoft Windows Network 
OK   E:  \\computer1\share2 Microsoft Windows Network 
disconnected F:  \\computer2\share Microsoft Windows Network 
Command executed successfully. 

完整的文檔片斷(在WinXP工作及以上):

if "%~d0" == "\\" (
    set nshare=1 
) else (
    set nshare=0 
    for /f "tokens=2" %%a in ('net use ^| findstr /r /c:" [A-Z]: "') do (
     if "%%a" == "%~d0" set nshare=1 
    ) 
) 

評論的請求:-)

+0

備註:如果* local *批次是在一個網絡共享,並開始與UNC路徑:'\\ localhost \ share \ local.bat'(但我很好) –

2

可能出現的問題要檢查驅動器(%~d0)是本地的,你可以使用wmic查詢:

wmic LogicalDisk where(DeviceID="%~d0" AND DriveType=3) get Description,DeviceID,DriveType 

鑑於%~d0擴展到本地驅動器C:,輸出看起來LIK E:

Description  DeviceID DriveType 
Local Fixed Disk C:  3 

萬一%~d0是網絡驅動器Z:,誤差輸出爲:

No Instance(s) Available. 

不幸的是,wmic不設置ErrorLevel在任何情況下匹配,但上述消息返回在STDERR流ra因爲我們可以應用重定向來丟棄STDOUT(在驅動器匹配的情況下;

2>&1 > nul wmic LogicalDisk where (DeviceID="%~d0" AND DriveType=3) 

因此,命令行返回:使得它不無論如何使用)和重定向STDERRSTDOUT代替(所以在STDOUT返回的情況下,該錯誤消息)被省略的get查詢%~d0是一個本地驅動器,但沒有其他的東西。現在讓我們通過for /F環捕捉(轉移)STDOUT

for /F "delims=" %%L in (' 
    2^>^&1 ^> nul wmic LogicalDisk where ^(DeviceID^="%~d0" AND DriveType^=3^) 
') do echo Drive "%~d0" is not local! 

所以如果%~d0點到本地驅動器,不執行的for /F身體,但除此之外,它是。


根據this resource,WMI因此wmic命令行工具是自Windows XP(教授)向前可用;它雖然在Windows XP Home上不可用。 wmic不需要管理權限。從WMI的可用性開始,Win32_LogicalDisk類可用。有關WMI/wmic的更多信息,請參考以下資源:Windows Management Instrumentation: Frequently Asked QuestionsWMIC - Take Command-line Control over WMI

+1

謝謝你的答案。我假設一個「在STDERR流而不是STDERR流返回的錯字」。 你知不知道/你能檢查所有系統上是否有LogicalDisk? –

+1

WMI已經在Win2000 +和WinME +中可用。您甚至可以將其安裝在較舊的系統上(Windows 95/98/NT 4.0) - 從MS下載中刪除下載,但在搜索「WMI CORE 1.5」時可以根據需要找到它。 –

+0

我改正了錯字,謝謝你的提示!我不確定WMI和'wmic'命令行工具是否同時引入(在所有Windows 2000/XP版本中)... – aschipfl

相關問題