8

ドライブ文字(などX:\foo\bar.txt)を使用してパスを同等のUNCパスに解決する普遍的な方法があるかどうか疑問に思います。これは、次のいずれかになります。

  • X:\foo\bar.txt実ドライブの場合X:(ハードディスク、USBスティックなど)
  • \\server\share\foo\bar.txtX:ネットワークドライブがマウントされている場合\\server\share
  • C:\xyz\foo\bar.txtがへのコマンドマッピングX:の結果である場合SUBSTX:C:\xyz

私は次のような部分的な解決策があることを知っています:

  1. ネットワークドライブを解決します(たとえば、に依存する質問556649WNetGetUniversalNameを参照してください)

  2. SUBSTドライブ文字を解決します(QueryDosDeviceどちらが期待どおりに機能するかを確認しますが、ローカルドライブやネットワークドライブなどのUNCパスは返しません)。

Win32でこのドライブ文字解決を実装する簡単な方法がありませんか?それとも、私は本当に両方をいじって、WNetGetUniversalName必要QueryDosDeviceなものを手に入れる必要がありますか?

4

2 に答える 2

6

ドライブ文字を 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!
于 2011-01-12T14:50:13.913 に答える
4

はい、ドライブ文字を個別に解決する必要があります。

WNetGetUniversalName()近づいていますが、実際のUNC共有にマップされているドライブ文字に対してのみ機能します。これは常に当てはまるとは限りません。すべての作業を代行する単一のAPI関数はありません。

于 2009-08-20T00:24:43.750 に答える