2009-04-22 12 views
18

मैं .bat फ़ाइल के भीतर से फ़ाइल की मूल निर्देशिका प्राप्त करना चाहता हूं। इसलिए, एक चर सेट को "C:\MyDir\MyFile.txt" पर दिया गया है, मैं "C:\MyDir" प्राप्त करना चाहता हूं। दूसरे शब्दों में, एक विशिष्ट यूनिक्स पर्यावरण में dirname() कार्यक्षमता के बराबर। क्या यह संभव है?मैं बैच फ़ाइल में dirname() के बराबर कैसे प्राप्त करूं?

+1

मैंने रिक्त स्थान के साथ फ़ाइल नामों के बारे में एक टिप्पणी जोड़ा; उन लोगों के साथ परीक्षण करना भूल गए। – Joey

उत्तर

20
for %%F in (%filename%) do set dirname=%%~dpF 

यह ड्राइव और %filename% में संग्रहीत फ़ाइल नाम की सूची को %dirname% सेट हो जाएगा।

रिक्त स्थान वाले फ़ाइल नामों के साथ सावधान रहें, हालांकि। या तो वे आसपास के उद्धरण के साथ सेट करने की आवश्यकता:

set filename="C:\MyDir\MyFile with space.txt" 

या आप for पाश में तर्क के आसपास उद्धरण डाल करने के लिए है:

for %%F in ("%filename%") do set dirname=%%~dpF 

या तो विधि काम करेगी एक ही समय में दोनों जीता, 'टी :-)

+0

मुझे लगता है कि आपका मतलब है, "लूप में तर्क के चारों ओर * उद्धरण * डालें:" – aphoria

+0

हाँ, धन्यवाद। वर्तमान में ठीक से नहीं सोच सकता :) – Joey

+0

@mosh, हार्डलिंक के लिए अपेक्षित परिणाम क्या है? यह भी ध्यान रखें कि आपके कामकाज यूनिकोड फ़ाइल नामों और कंसोल फ़ॉन्ट से संवेदनशील हैं। – Joey

6

जो भी कारण आप के लिए (कोई कमान एक्सटेंशन आदि) का उपयोग नहीं कर सकते हैं के लिए आप के साथ दूर होने के लिए सक्षम हो, तो हो सकता है .. \ हैक:

set file=c:\dir\file.txt 
set dir=%file%\..\ 
+0

यह समाधान (सीडी/डी फ़ाइल \ ..) Win7 में बेहतर काम करता है, दूसरा समाधान कभी-कभी Win7 %% ~ डीपीएफ में विफल रहता है। – mosh

+0

@ ben-key उत्तर पर मेरी टिप्पणी देखें। – Vertigo

3

लूप के साथ समस्या यह है कि यह स्ट्रिंग के अंत में पीछे की ओर छोड़ देता है। यदि आप कई बार डायरनाम प्राप्त करना चाहते हैं तो इससे समस्याएं पैदा होती हैं। शायद आपको उस निर्देशिका का नाम प्राप्त करने की आवश्यकता है जो निर्देशिका के दादा-दादी है, जिसमें केवल मूल निर्देशिका की बजाय फ़ाइल है। बस लूप तकनीक का उपयोग करने के लिए दूसरी बार \ को हटा देगा, और दादाजी निर्देशिका नहीं मिलेगी।

यह है कि आप बस निम्न कार्य नहीं कर सकते हैं। , नहीं "c: \ 1 \ 2":

set filename=c:\1\2\3\t.txt 
for %%F in ("%filename%") do set dirname=%%~dpF 
for %%F in ("%dirname%") do set dirname=%%~dpF 

यह dirname के लिए "\ 1 \ 2 \ 3 ग" सेट हो जाएगा।

निम्न कार्य पीछे की ओर खींचकर समस्या को हल करता है \।

:dirname file varName 
    setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 
    SET _dir=%~dp1 
    SET _dir=%_dir:~0,-1% 
    endlocal & set %2=%_dir% 
GOTO :EOF 

इसे निम्नानुसार कहा जाता है।

set filename=c:\1\2\3\t.txt 
call :dirname "%filename%" _dirname 
call :dirname "%_dirname%" _dirname 
+0

पिछली \ समस्या के लिए अच्छा समाधान। अन्यथा कोई भी '% dirname%' 'का उपयोग नहीं कर सकता है क्योंकि अंतिम उद्धरण पिछले स्लैश से बच जाएगा। ऐसे मामले में '"% dirname% \ "' काम करता है। लेकिन उनमें से केवल एक ही समय में। – Vertigo

संबंधित मुद्दे