Windows のドライブ文字をパス (サブストレートとネットワーク) に解決します。

StackOverflow https://stackoverflow.com/questions/1299814

質問

ドライブ文字を使用してパスを解決する普遍的な方法(たとえば、 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 でこのドライブ文字の解決を実装する簡単な方法が欠けているのでしょうか?それとも本当に両方をいじる必要があるのでしょうか WNetGetUniversalName そして QueryDosDevice 必要なものを手に入れるには?

役に立ちましたか?

解決

はい、あなたは独立して、ドライブ文字を解決する必要があります。

WNetGetUniversalName()は近づくが、唯一、常にそうではありません、実際のUNC共有にマップされたドライブ文字のために動作します。あなたのための作業のすべてを行う単一のAPI関数はありません。

他のヒント

ここで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!
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top