【问题标题】:Determine what drive letter a network share is mapped to using batch file使用批处理文件确定网络共享映射到哪个驱动器号
【发布时间】:2020-06-05 06:26:17
【问题描述】:

问题: 我无法使用批处理文件识别网络共享映射到的驱动器号。

背景: 我们在工作中映射和使用大约十几个网络共享驱动器,批处理文件当前将驱动器映射到“常用”驱动器号。但我想知道它是否映射到任何字母(如果是,那个字母是什么),因为我们有超过 200 台使用这些映射驱动器的 PC,而且字母通常不同,所以再次将其映射到“通常”字母会导致重复的映射网络驱动器。

我可以看到网络共享映射到net use 中的驱动器,并且可以使用 UNC 路径或映射的驱动器号访问它,所以不知道为什么我无法获取驱动器号。

我为这个问题找到了以下 3 个答案,但由于某种原因,它们都不适合我。从每个获得的 URL、代码和结果如下所示。非常感谢任何帮助!


Mapping a network drive without hardcoding a drive letter in a batch file

for /f "tokens=2" %%i in ('net use ^| find "\\NetworkShare1\Share1"') do set netdrive=%%i

结果:\NetworkShare1\Share1 已被映射


Return users mapped drive letter from network drive remote

FOR /F "tokens=2" %%D IN ('net use ^| find ":" ^| find /I "\\NetworkShare1\Share1"') DO ECHO Drive letter is %%D

结果:驱动器号为 \NetworkShare1\Share1


How to get drive letter of mapped network drive

for /f "tokens=2,3" %%i in ('net use') do if '%%j=='\\NetworkShare1\Share1 set drive=%%i
echo %drive%

结果:回声已关闭。

【问题讨论】:

  • 你在命令提示符下单独使用net use会有什么结果?
  • @NekoMusume 单独使用net use 会按预期显示所有映射网络驱动器的列表。
  • 这个怎么样:wmic LogicalDisk where "ProviderName='\\\\NetworkShare\\Share1'" get DeviceID /VALUE(每个\ 需要通过加倍为wmic命令行转义);如果有这样的,这应该返回映射的驱动器号......
  • 谢谢@aschipfl。您可能希望在上面的评论中将您对“/”的解释添加到下面的答案中。这是很好的澄清。

标签: windows batch-file


【解决方案1】:

在我的 Windows 10 机器上:

@echo off
set UNC=\\yourserver\yourshare
set drv=

for /f "delims=: " %%a in ('net use ^| find /i "%UNC%"') do set drv=%%a
if defined drv (
   echo "%UNC%" is mapped to %drv%:
   ) else (
      echo "%UNC%" is not mapped to anything.
)
echo/
pause

注意:后面有个空格

另外我应该注意,如果共享映射到多个驱动器号,则只会返回映射的“最后一个”驱动器号。我相信它是按字母顺序排列的。

你知道吗——我会建议改变一下。这将列出映射到路径的所有驱动器,并且它将包括部分匹配项。换句话说,如果您搜索\serv1\data,它也将匹配\serv1\data\subfolder。但它也会匹配\serv1\datagram。这可能有用或有问题。

@echo off
set "UNC=\\yourserver\yourshare"
set UNCfound=no

for /f "tokens=1,2 delims=: " %%a in ('net use ^| find /i "%UNC%"') do (
   echo "%%~b" is mapped to %%a:
   set UNCfound=yes
)
if "%UNCfound%"=="no" echo "%UNC%" is not mapped to anything.

echo/
pause

根据我的测试,如果您在find 表达式中添加空格,则可以进行完全匹配:

@echo off
set "UNC=\\yourserver\yourshare"
set UNCfound=no

for /f "tokens=1,2 delims=: " %%a in ('net use ^| find /i "%UNC% "') do (
   echo "%%~b" is mapped to %%a:
   set UNCfound=yes
)
if "%UNCfound%"=="no" echo "%UNC%" is not mapped to anything.

echo/
pause

【讨论】:

  • 这也适用于 Windows 7 企业版。正是我所需要的,感谢您的帮助!
  • 请注意,net use 可能会返回已连接但未映射到驱动器号的网络共享。
  • @avery_larry 感谢更新多个映射。它可能很有用。
  • @aschipfl 感谢您提醒未映射到“网络使用”中显示的驱动器号的映射位置。值得庆幸的是,这在我们的企业环境中不应该成为问题,但仍然需要牢记!
【解决方案2】:

这是一种以wmic command 为特色的方法,使用Win32_LogicalDisk class

@echo off
set "UNC=\\ATMEDFS01\workgroups\R&D\Systems"
set "DRV="

for /F "delims=" %%I in ('
    wmic LogicalDisk where "DriveType=4 and ProviderName='%UNC:\=\\%'" get DeviceID /VALUE 2^> nul
') do for /F "tokens=1* delims==" %%J in ("%%I") do set "DRV=%%K"

if defined DRV (
    echo The network share "%UNC%" is mapped to drive %DRV%.
) else (
    echo The network share "%UNC%" is NOT mapped to a drive.
)

wmic 命令行的where 子句中,每个\ 都需要通过加倍来转义;这就是sub-string substitution expression %UNC:\=\\% 的用途。

【讨论】:

猜你喜欢
  • 2021-02-23
  • 1970-01-01
  • 2021-11-05
  • 2018-02-22
  • 2014-06-25
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多