使用
轻松获取当前批次所在的驱动器set batchdrive=%~d0
但是如何检查%batchdrive%
是否在本地驱动器上而不在(映射的)网络共享上?
检查%SYSTEMDRIVE%
或固定列表" C:" " d:" ......不可靠。
答案 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 Questions和WMIC - 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
)
)
对所要求的可能问题的评论: - )