批量检查映射的网络驱动器是否存在

41

我正在编写一个脚本,应该将网络驱动器映射到字母Z,我使用命令net use z: \\path,问题在于,如果用户已经使用此字母,我将无法对其进行映射,有没有办法检查此驱动器(Z)的存在,并且如果它存在,则卸载它并将其挂载到另一个字母上,仍然可以使用我脚本需要的z驱动器,这是安装的一部分,并且应该在Z驱动器上。


for /F "tokens=1,2*" %G in ('net use^|Find "\\"^|Find /I "Z:"') do @echo %H %I 开始,以查看示例。 (在批处理脚本中使用它时,请将“%”符号加倍,使用“%%G”,“%%H”等)。了解更多... 然后您可以将简单的 @echo %%H %%I 替换为 FOR循环中的多个命令。如有不理解之处,请随时更新您的问题并提出更多问题。 - JosefZ
1
为什么不使用下一个可用的驱动器号,而是破坏用户当前的驱动器映射:net use * \\path。或者您可以使用PUSHD命令,它将映射下一个可用的驱动器号,并立即更改到该路径的目录:PUSHD \\path - Squashman
6个回答

61

您可以通过IF EXIST Z:\来检查驱动器是否已挂载。这应该有效:

if exist z:\ (
    net use z: /delete
)
net use z: \\path

19
也很有用:如果z:\不存在,则执行以下操作(net use z: \\my\unc\path)。请注意,本翻译仅为指导方便,不得用于任何法律目的。 - Jeroen
2
这只回答了问题的一部分,没有回答重新映射驱动器到不同字母的完整问题。 - jaylweb
2
注意:如果您有一个已断开但仍被记住的映射驱动器,则无法通过此方式访问它。我还没有找到解决方法/最终只能删除映射驱动器,而不管是否存在if条件。 - JohnLBevan

6
我使用以下脚本位来取消映射所有驱动器:
:: First unmap all network drives
FOR /F "tokens=1,2,3" %%G IN ('net use^| Find "\\"') DO (
  ECHO.Unmapping %%I from drive letter %%H
  NET USE %%H /D > NUL
)

它是做什么的?让我们把它分解一下

FOR /F "tokens=1,2,3" %%G IN () DO ()-->将遍历()之间定义的集合,第一个、第二个和第三个单词(任何空格都用作分隔符)将分别作为%%G、%%H和%%I可用。

('...')将运行一个命令...并将结果传递给FOR循环

net use将输出类似于以下内容:

New connections will be remembered.


Status       Local     Remote                    Network

-------------------------------------------------------------------------------
OK           M:        \\diskstation\music       Microsoft Windows Network
OK           P:        \\diskstation\home        Microsoft Windows Network
OK           V:        \\diskstation\video       Microsoft Windows Network
OK           X:        \\diskstation\photo       Microsoft Windows Network
The command completed successfully.

该输出会被导入到 Find.exe(Windows系统中类似于 grep 的命令)中,以查找“\\”。

管道符号 | 使用 ^ 进行转义,以便 cmd 不直接执行它。输出结果将如下所示:

OK           M:        \\diskstation\music       Microsoft Windows Network
OK           P:        \\diskstation\home        Microsoft Windows Network
OK           V:        \\diskstation\video       Microsoft Windows Network
OK           X:        \\diskstation\photo       Microsoft Windows Network

NET USE /D命令将删除所选映射的驱动器映射。


1
首先,这并没有回答帖子的问题。其次,如果远程 UNC 路径很长,它会出现错误,并导致网络列显示在第二行。这个脚本对于删除所有驱动器映射来说过于复杂了。一个更简单的方法是使用 net use * /d /y 来删除所有驱动器映射。 - jaylweb
第三,如果“状态”不是“OK”并且由多个单词组成,例如“不可用”,它将会中断。然后“tokens”将捕获错误的部分。 - stackprotector

4
另一种可能的方法是:
net use Z:
if %errorlevel% EQU 0 net use Z: /delete
net use Z: \\path

我喜欢这个,因为你只需要使用共享功能就可以了,例如 net use \\some\share - dmarlow

3
我的要求与提问者有些不同:我需要映射一个网络驱动器,总是映射到相同的路径,但只有在该路径不存在时才进行映射。
if not exist z:\ (
    net use z: \\ComputerName\ShareName
)

2
z:可能处于断开连接或不可用状态,在这种情况下重新映射可能会失败。 - Konstantin Glukhov

1

在批处理中,您可以编写如下代码:

@echo off
net use V: >nul 2>&1
if %errorlevel% equ 0 goto unmap

如果在Windows 10上存在V:\不起作用,同时net use显示额外的信息,我现在已经使用>nul 2>&1来抑制它。

1
为了回答原问题,您可以检查Z是否已经映射,并将其重新映射到不同的驱动器号(例如y:),然后将z映射到新路径。
if exist z:\ (
    for /F "tokens=1,2*" %%G in ('net use^|Find "\\"^|Find /I "z:"')  do ( net use y: %%H )
    net use z: /delete
)
net use z: \\path

如下所述的类似答案已经被评论,if exist z:\ 不会检查驱动器号是否只是映射。相反,它仅在驱动器号已映射且目标可用时返回 true。因此,使用您的解决方案,您无法删除当前不可用的映射驱动器。 - stackprotector

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接