2009-08-19 64 views
6

我想知道是否有一種通用的方法使用驅動器號(例如X:\foo\bar.txt)將路徑解析到其等效的UNC路徑中,該路徑可能是以下之一:解決Windows驅動器號到一個路徑(子網和網絡)

  • X:\foo\bar.txt如果X:是一個真正的驅動器(即硬盤,USB棒等)
  • \\server\share\foo\bar.txt如果X:是安裝在\\server\share
  • C:\xyz\foo\bar.txtX:如果網絡驅動器是一個012的結果命令映射X:C:\xyz

我知道有部分的解決方案,這將:

  1. 解決網絡驅動器(例如見question 556649其依賴於WNetGetUniversalName

  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技巧的場合。 – 2011-01-13 04:41:17

+1

這個腳本很棒。只有一個錯誤 - 它不支持替代驅動路徑中的空格。要修復,請將第一個for循環改爲: ... tokens = 1,2 ... 至 ... tokens = 1 * ... – 2011-04-11 13:52:57

+0

@MrBungle:謝謝!我不知道'tokens = 1 *',會調查。你確定它不是'1,2 *'嗎? – Benoit 2011-04-11 18:25:32