【问题标题】:Resolve Windows drive letter to a path (subst and network)将 Windows 驱动器号解析为路径(subst 和 network)
【发布时间】:2009-08-19 13:05:45
【问题描述】:

我想知道是否有一种通用方法可以将使用驱动器号(例如X:\foo\bar.txt)的路径解析为其等效的 UNC 路径,可能是以下路径之一:

  • X:\foo\bar.txt 如果X: 是真实驱动器(即硬盘、U 盘等)
  • \\server\share\foo\bar.txt 如果X: 是安装在\\server\share 上的网络驱动器
  • C:\xyz\foo\bar.txt 如果X:SUBST 命令映射X:C:\xyz 的结果

我知道有部分解决方案可以:

  1. 解析网络驱动器(参见例如依赖于WNetGetUniversalNamequestion 556649

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

我是否缺少在 Win32 中实现此驱动器号解析的直接方法?还是我真的必须同时使用WNetGetUniversalNameQueryDosDevice 才能得到我需要的东西?

【问题讨论】:

    标签: winapi networking resolve drive-letter subst


    【解决方案1】:

    这是一个将驱动器号转换为 UNC 路径或反向替代路径的批处理。但不能保证它有效。

    使用示例: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 技巧的机会。
    • 这个脚本很棒。只有一个错误 - 它不支持替换驱动器路径中的空格。要解决此问题,请将第一个 for 循环从: ... tokens=1,2 ... 更改为 ... tokens=1* ...
    • @MrBungle:谢谢!我不知道tokens=1*,将进行调查。你确定不是1,2*
    【解决方案2】:

    是的,您需要独立解析驱动器号。

    WNetGetUniversalName() 接近,但仅适用于映射到实际 UNC 共享的驱动器号,但情况并非总是如此。没有一个 API 函数可以为您完成所有工作。

    【讨论】:

    • 未映射到 UNC 共享的案例是什么样的?它可以映射到不是有效共享的 UNC 路径吗?还是到根本不是 UNC 路径的路径?一些具体的例子会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-06-27
    • 2020-02-09
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多