2009-08-19 26 views
6

Bir sürücü harfini (X:\foo\bar.txt gibi) eşdeğer UNC yoluna kullanarak bir yolu çözmenin evrensel bir yolu olup olmadığını merak ediyorum;Windows sürücü harfini bir yolla (alt ve ağ) çözme

  • X:\foo\bar.txtX: gerçek sürücü ise (yani vs. sabit disk, USB çubuğu,)
  • \\server\share\foo\bar.txtX: eğer \\server\share
  • C:\xyz\foo\bar.txt eğer X: üzerine monte edilmiş bir ağ sürücüsü olan 012 sonucudurkomut haritalama X: Ben edecek kısmi çözümler olduğunu biliyoruz

C:\xyz için:

  1. bir ağ sürücüsünü Çöz

  2. Çöz (WNetGetUniversalName dayanır Örneğin question 556649 için bakınız) SUBST sürücü harfi (beklendiği gibi çalışır, ancak yerel sürücüler veya ağ sürücüleri gibi şeyler için UNC yollarını döndürmez) başlıklı (bkz. QueryDosDevice).

Win32'de bu sürücü harfi çözümlemesinin uygulanmasının bazı basit yollarını özlüyor muyum? Ya da ihtiyacım olanı almak için hem WNetGetUniversalName hem de QueryDosDevice ile uğraşmak zorunda mıyım?

cevap

2

Evet, sürücü harfini bağımsız olarak çözmeniz gerekir.

WNetGetUniversalName(), yakın gelir, ancak yalnızca gerçek UNC paylaşımlarıyla eşleştirilen sürücü harfleri için çalışır; bu her zaman böyle değildir. Tüm çalışmaları sizin için yapan tek bir API işlevi yoktur.

6

Sürücü harflerini UNC yollarına çevirmek veya alt katmanları tersine çevirmek için bir toplu iş kümesi. Garantili olsa da çalışır. Kullanım

Örnek: 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

ah evet, CMD yol gidiyor Başlangıçta reddedilen bir çözümdür. Gerçekten hile yapacak bir Win32 API bulmaya çalışıyordum. Açıkçası, çözümünüzün aynı şeyi bir parti/komut dosyası ortamında yapmaya çalışan insanlar için çalışması gerekir. Fikirleriniz için çok teşekkürler; bazı CMD numaralarını keşfetmem için bir fırsattı. –

+1

Bu betik harika. Sadece bir hata - değiştirilen sürücü yolundaki boşlukları desteklemiyor. Düzeltmek için, ilk döngü için aşağıdakileri değiştirin: ... tokens = 1,2 ... - ... token = 1 * ... –

+0

@MrBungle: Teşekkürler! Ben bilmiyorum 'tokens = 1 *, araştıracak. 1,2 * 'olmadığından emin misin? – Benoit