将Windows的驱动器号解析为路径(subst和网络)

8
我想知道是否有一种通用的方法来将使用驱动器号(例如)的路径解析为其等效的UNC路径,可能是以下之一:
  • 如果X:是实际驱动器(即硬盘,USB存储器等),则为
  • 如果X:是挂载在<\\ server \ share>上的网络驱动器,则为<\\ server \ share \ foo \ bar.txt>
  • 如果X:是通过SUBST命令映射到C:\ xyz的结果,则为
我知道有部分解决方案可以:
  1. 解析网络驱动器(请参见问题556649,该问题依赖于WNetGetUniversalName)

  2. 解析SUBST驱动器号(请参阅QueryDosDevice,它按预期工作,但不会返回诸如本地驱动器或网络驱动器之类的UNC路径)。

我是否遗漏了在Win32中实现此驱动器号解析的简单方法?还是我真的必须同时使用WNetGetUniversalName和QueryDosDevice来获得所需内容?
2个回答

6

这是一个批处理程序,用于将驱动器号转换为UNC路径或反向substed路径。但不保证它能正常工作。

使用示例:script.cmd echo Z: Y: W:

@echo off
:: u is a variable containing all arguments of the current command line
set u=%*

:: enabledelayedexpansion: exclamation marks behave like percentage signs and enable
:: setting variables inside a loop
setlocal enabledelayedexpansion

:: parsing result of command subst
:: format:  I: => C:\foo\bar
:: variable %G will contain I: and variable H will contain C:\foo\bar
for /f "tokens=1* delims==> " %%G IN ('subst') do (
set drive=%%G
:: removing extra space
set drive=!drive:~0,2!
:: expanding H to a short path in order not to break the resulting command line
set subst=%%~sfH
:: replacing command line.
call set u=%%u:!drive!=!subst!%%
)

:: parsing result of command net use | findstr \\ ; this command is not easily tokenized because not always well-formatted
:: testing whether token 2 is a drive letter or a network path.
for /f "tokens=1,2,3 delims= " %%G IN ('net use ^| findstr \\') do (
set tok2=%%H
if "!tok2:~0,2!" == "\\" (
  set drive=%%G
  set subst=%%H
) else (
  set drive=%%H
  set subst=%%I
)
:: replacing command line.
call set u=%%u:!drive!=!subst!%%
)

call !u!

啊,是的,采用CMD方式是我最初拒绝的解决方案。我真的在试图找到一个能够完成任务的Win32 API。显然,你的解决方案应该适用于那些在批处理/脚本环境中尝试做同样事情的人。非常感谢你的想法;这让我有机会(重新)发现一些CMD技巧。 - Pierre Arnaud
1
这个脚本很棒。只有一个小bug - 它不支持替换驱动器路径中的空格。要修复它,请将第一个for循环从: ... tokens=1,2 ... 改为 ... tokens=1* ... - Mr. Bungle
@MrBungle:谢谢!我不知道tokens=1*,会去了解一下。你确定它不是1,2*吗? - Benoit

4
是的,您需要独立解决驱动器字母的问题。 WNetGetUniversalName() 函数接近于解决此问题,但仅适用于映射到实际UNC共享的驱动器字母,这并不总是情况。没有单个API函数可以为您完成所有工作。

一个不映射到 UNC 共享路径的情况是什么样子?它是否可以映射到一个无效的 UNC 路径或者根本不是 UNC 路径的路径?一些具体的例子会有所帮助。 - Zyl

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