解决Windows盘符的路径(SUBST和网络)(Resolve Windows drive let

2019-08-01 17:23发布

我不知道是否有使用的驱动器盘符(如解析路径的一个普遍的方式X:\foo\bar.txt )成等效的UNC路径,这可能是下列之一:

  • X:\foo\bar.txt如果X:是一个真正的驱动器(即硬盘,USB棒等)
  • \\server\share\foo\bar.txt如果X:是安装在一个网络驱动器\\server\share
  • C:\xyz\foo\bar.txt如果X:是的结果SUBST命令映射X:C:\xyz

我知道有部分解决方案,来:

  1. 解决网络驱动器(例如见问题556649依赖于WNetGetUniversalName

  2. 解决SUBST驱动器盘符(见QueryDosDevice其正常工作,但不返回的东西,如本地驱动器或网络驱动器UNC路径)。

我缺少实现在Win32中这个盘符分辨率的一些简单的方法? 还是我真的有既混乱WNetGetUniversalNameQueryDosDevice得到我需要什么?

Answer 1:

是的,你需要独立解决的驱动器盘符。

WNetGetUniversalName()接近,但只适用于映射到实际的UNC共享,这是情况并非总是如此的驱动器号。 有是做所有的工作对你没有单一的API函数。



Answer 2:

这里是一个批量翻译驱动器号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!


文章来源: Resolve Windows drive letter to a path (subst and network)