2009-08-19 10 views
6

ドライブ文字(X:\foo\bar.txtなど)を使用して、対応するUNCパスにパスを解決する普遍的な方法があるのだろうか。 X:場合Windowsのドライブ文字をパス(substとネットワーク)に解決する

  • X:\foo\bar.txtX:場合は、実際のドライブ(などすなわちハードディスク、USBスティック、)
  • \\server\share\foo\bar.txtあるX:場合\\server\share
  • C:\xyz\foo\bar.txtに取り付けられたネットワークドライブには、012の結果です私は意志部分解があることを知っているC:\xyz

からコマンドマッピングX:

  1. は、ネットワークドライブを解決するには(WNetGetUniversalNameに依存しているインスタンスquestion 556649を参照)

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

私はWin32でこのドライブ文字解決を実装する簡単な方法がありませんか?または、私は実際に私が必要とするものを得るためにWNetGetUniversalNameQueryDosDeviceの両方を混乱させる必要がありますか?

答えて

2

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

WNetGetUniversalName()が閉じても、実際のUNC共有にマップされているドライブ文字に対してのみ動作しますが、必ずしもそうではありません。すべての作業を行う単一のAPI関数はありません。

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! 
+0

ああ、はい、CMDの道を行くことは、私が最初に拒否されたソリューションです。私は実際にそのトリックを行うWin32 APIを見つけることを試みていました。明らかに、あなたのソリューションはバッチ/スクリプト環境で同じことをしようとする人々のために働くはずです。あなたのアイデアに感謝します。 CMDのトリックを発見する機会がありました。 –

+1

このスクリプトは素晴らしいです。ただ1つのバグです。置換ドライブパスのスペースをサポートしていません。修正するには、最初のforループを以下から変更してください: ...トークン= 1,2 ... 〜 ...トークン= 1 * ... –

+0

@MrBungle:ありがとうございます!私は 'tokens = 1 *'について知りませんでした。調査します。 '1,2 *'ではないと確信していますか? – Benoit

関連する問題