2009-08-19 14 views
6

मुझे आश्चर्य है कि एक ड्राइव अक्षर (जैसे X:\foo\bar.txt) का उपयोग करके पथ को हल करने का सार्वभौमिक तरीका है जो इसके समकक्ष यूएनसी पथ में है, जो निम्न में से एक हो सकता है:एक पथ (प्रतिस्थापन और नेटवर्क) के लिए विंडोज ड्राइव अक्षर को हल करें

  • X:\foo\bar.txt अगर X: कोई वास्तविक दूरी पर स्थित है (यानी हार्ड डिस्क, यूएसबी स्टिक, आदि)
  • \\server\share\foo\bar.txt अगर X: नेटवर्क डिस्क \\server\share
  • C:\xyz\foo\bar.txt अगर X: पर रखा है एक 012 का परिणाम हैआदेश मानचित्रण X:

मैं जानता हूँ कि आंशिक समाधान जो होगा देखते हैं कि C:\xyz रहे हैं:

  1. नेटवर्क डिस्क का समाधान करें (देखें उदाहरण question 556649 जो WNetGetUniversalName पर निर्भर करता है के लिए)

  2. का समाधान करें SUBST ड्राइव अक्षर (देखें QueryDosDevice जो अपेक्षा के अनुसार काम करता है, लेकिन स्थानीय ड्राइव या नेटवर्क ड्राइव जैसी चीजों के लिए यूएनसी पथ वापस नहीं करता है)।

क्या मुझे Win32 में इस ड्राइव अक्षर रिज़ॉल्यूशन को लागू करने का कुछ सरल तरीका याद आ रहा है? या मुझे क्या चाहिए मुझे प्राप्त करने के लिए मुझे वास्तव में WNetGetUniversalName और QueryDosDevice दोनों के साथ गड़बड़ करनी है?

उत्तर

2

हां, आपको स्वतंत्र रूप से ड्राइव अक्षर को हल करने की आवश्यकता होगी।

WNetGetUniversalName() करीब आता है, लेकिन वास्तविक यूएनसी शेयरों के लिए मैप किए गए ड्राइव अक्षरों के लिए केवल काम करता है, जो हमेशा मामला नहीं होता है। कोई एकल एपीआई फ़ंक्शन नहीं है जो आपके लिए सभी काम करता है।

6

यूएनसी पथ या रिवर्स सबस्टेड पथों के लिए ड्राइव अक्षरों का अनुवाद करने के लिए यहां एक बैच है। गारंटी नहीं है कि यह काम करता है। उपयोग की

उदाहरण: 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

आह, हाँ, अध्यक्ष एवं प्रबंध निदेशक रास्ते पर जा रहा एक समाधान मैं शुरू में खारिज कर दिया है। मैं वास्तव में एक Win32 एपीआई खोजने की कोशिश कर रहा था जो चाल करेगा। जाहिर है, आपके समाधान को बैच/स्क्रिप्टिंग पर्यावरण में एक ही चीज़ करने की कोशिश करने वाले लोगों के लिए काम करना चाहिए। आपके विचारों के लिए बहुत बहुत धन्यवाद; यह मेरे लिए कुछ सीएमडी चाल खोजने के लिए अवसर था। –

+1

यह स्क्रिप्ट अद्भुत है। बस एक बग - यह प्रतिस्थापित ड्राइव पथ में रिक्त स्थान का समर्थन नहीं करता है। ठीक करने के लिए, पहले से लूप के लिए बदलें: ... टोकन = 1,2 ... से ... टोकन = 1 * ... –

+0

@MrBungle: धन्यवाद! मुझे 'टोकन = 1 *' के बारे में पता नहीं था, जांच करेगा। क्या आप वाकई '1,2 *' नहीं हैं? – Benoit