如何检查当前驱动器是否在本地磁盘(cmd)上?

时间:2016-11-29 10:12:10

标签: windows batch-file cmd

使用

轻松获取当前批次所在的驱动器
set batchdrive=%~d0

但是如何检查%batchdrive%是否在本地驱动器上而不在(映射的)网络共享上?

检查%SYSTEMDRIVE%或固定列表" C:" " d:" ......不可靠。

2 个答案:

答案 0 :(得分:2)

要检查驱动器(%~d0)是否是本地驱动器,您可以使用wmic查询:

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

鉴于%~d0扩展到本地驱动器C:,输出如下:

Description       DeviceID  DriveType
Local Fixed Disk  C:        3

如果%~d0是网络驱动器Z:,则错误输出为:

No Instance(s) Available.

不幸的是,wmic在没有匹配的情况下没有设置ErrorLevel,但是上面的消息是在 STDERR 流而不是 STDOUT <返回的/ em> stream,所以我们可以应用重定向来丢弃 STDOUT (如果驱动器匹配;因此get查询被省略,因为它仍未使用)并重定向 STDERR 改为 STDOUT (所以在 STDOUT 中返回错误消息以防万一):

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

因此,如果%~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,从Windows XP(教授)开始,WMI和wmic命令行工具可用;但它在Windows XP Home上不可用。 wmic不需要管理权限。自WMI可用以来,Win32_LogicalDisk类可用。有关WMI / wmic的更多信息,请参阅以下资源:Windows Management Instrumentation: Frequently Asked QuestionsWMIC - Take Command-line Control over WMI

答案 1 :(得分:0)

要检查的第一件事是batchdrive是否为未映射的网络共享(如果您在cmd.exe之外启动批处理文件,则会发生这种情况,例如通过双击或通过系统调用):

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

第二件事是检查batchdrive是否在网络共享列表中。这些显示为net use,其输出类似于

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. 

因此,我们使用findstr /r /c:" [A-Z]: "过滤所有看起来像磁盘驱动器的行的输出,并通过for /f "tokens=2"获取输出的第二部分。

完全剪断(使用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
   )
)

对所要求的可能问题的评论: - )