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

Posted

技术标签:

【中文标题】批量检查映射的网络驱动器是不是存在【英文标题】:Batch check if mapped network drive exists批量检查映射的网络驱动器是否存在 【发布时间】:2015-01-30 13:13:13 【问题描述】:

我目前正在编写一个脚本,应该将网络驱动器映射到字母 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 等)Learn more ...。然后你可以用multiple commands in FOR loop 替换那个简单的@echo %%H %%I。如有实际成就,请随时 update your question 询问更多信息,以防万一。 为什么不直接使用下一个可用的驱动器号而不是破坏用户当前的驱动器映射:net use * \\path。或者您可以使用 PUSHD 命令映射下一个可用驱动器号并立即更改目录到该路径:PUSHD \\path 【参考方案1】:

可以通过IF EXIST Z:\查看驱动是否挂载。这应该有效:

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

【讨论】:

也有用:if not exist z:\ (net use z: \\my\unc\path) 这仅回答了部分问题,并没有回答将驱动器重新映射到不同字母的完整问题。 注意;如果您有一个断开连接(但仍记得)的映射驱动器,则以这种方式访问​​时它不会显示。我还没有找到解决方法/最终只是删除了 if 条件并删除了映射的驱动器,无论是否存在)【参考方案2】:

另一种可能的方式是:

net use Z:
if %errorlevel% EQU 0 net use Z: /delete
net use Z: \\path

【讨论】:

我喜欢这个,因为你也可以通过共享来使用它,例如net use \\some\share【参考方案3】:

我使用以下脚本位来取消映射所有驱动器:

:: 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(相当于 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 将删除所选映射的驱动器映射

【讨论】:

首先,这并不能回答发帖者的问题。其次,如果远程 UNC 路径很长,则会中断,并导致网络列显示在第二行。这个脚本对于删除所有驱动器映射来说是多余的。删除所有驱动器映射的更简单方法是使用 net use * /d /y。 第三,如果 Status 不是 OK 并且由多个单词组成,它会中断 e。 G。 Not available。然后tokens 会捕捉到错误的部分。【参考方案4】:

要回答原始问题,您可以检查 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 exists z:` 不会检查驱动器号是否刚刚映射。相反,如果驱动器号已映射并且目标可用,则返回 true。因此,使用您的解决方案,您无法删除当前不可用的映射驱动器。【参考方案5】:

你可以批量编写这样的代码:

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

如果存在 V:\ 在 Windows 10 上不起作用,net use 也会显示其他信息,我现在使用 >nul 2>&1 将其隐藏。

【讨论】:

【参考方案6】:

我的要求与 OP 的要求略有不同:我需要映射一个网络驱动器,始终映射到相同的路径,但前提是它不存在

if not exist z:\ (
    net use z: \\ComputerName\ShareName
)

【讨论】:

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

以上是关于批量检查映射的网络驱动器是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

检查网络驱动器是否已连接为Windows服务[关闭]

Tortoise SVN图标叠加未显示在共享映射网络驱动器文件夹中

怎么映射网络驱动器

关于映射网络驱动器不成功的问题

C# - 添加“网络位置”,而不是映射驱动器

无法断开网络驱动器.