DOS कमांड द्वारा वर्तमान फ़ोल्डर नाम प्राप्त करें?


58

क्या डॉस कमांड का उपयोग करके वर्तमान फ़ोल्डर नाम (वर्तमान निर्देशिका पथ नहीं) प्राप्त करना संभव है? यदि हां, तो कैसे?

निकटतम मैं यह था, लेकिन यह ऐसा नहीं करता है:

for /f "delims=\" %%a in ("%CD%") do set CURR=%%a
echo.DIR: %CURR%

नोट: उपरोक्त प्रयास मुझे स्ट्रिंग को टोकन देने और CURR चर के रूप में अंतिम टोकन सेट प्राप्त करने का प्रयास कर रहा था।


यदि आपके पास किसी भी प्रकार का GNU टूलसेट स्थापित है, तो आपको जाने में सक्षम होना चाहिए cd | sed "s/.*\\//"(जो कि cd (cwd) के आउटपुट को एक नियमित अभिव्यक्ति खोज में बदल देता है और प्रतिस्थापित कर देता है, अंतिम \
_ के बिना

2
मुझे GNU टूल से बचने की आवश्यकता है ताकि बैच फ़ाइल किसी के लिए भी कहीं भी काम करे। मेरा सवाल वैसे भी "शुद्ध डॉस" के लिए है।
djangofan

ठीक है। एक त्वरित Google ने regex खोज को लागू करने और VBScript ( stackoverflow.com/questions/127318/… ) में प्रतिस्थापित करने के लिए एक SO परिणाम दिखाया, जो एक ही वाक्यविन्यास का उपयोग कर सकता है और एक ही परिणाम बना सकता है - मेरा मानना ​​है कि VBScript को विंडोज़ 98 के बाद से बनाया गया है, इसलिए हर किसी के लिए कहीं भी होना चाहिए! (आप * nix OS ’पर भी काम करने के लिए इसे बहुत आसानी से रिजेक्ट कर सकते हैं)
फ़ोशी जूल

3
FYI करें, न for /fही TomWij के %~n*MS-DOS में समर्थित हैं। (विंडोज ' cmd.exeहै नहीं डॉस, यह एक देशी Windows प्रोग्राम है।)
grawity

जवाबों:


84

सबसे छोटा तरीका जो मैंने पाया है:

for %I in (.) do echo %~nxI

या एक .bat स्क्रिप्ट के भीतर:

for %%I in (.) do echo %%~nxI

या चर में मूल्य प्राप्त करें।

for %%I in (.) do set CurrDirName=%%~nxI
echo %CurrDirName%

स्पष्टीकरण: http://www.robvanderwoude.com/ntfor.php

nx का अर्थ केवल फ़ाइल नाम और एक्सटेंशन है


मुझे लिंक और सुझाव पसंद है, लेकिन जब मैं एक बैच फ़ाइल में डाल देता हूं तो मुझे बिना किसी आउटपुट के शेल का तत्काल समापन मिलता है। वहाँ कहीं एक वाक्यविन्यास त्रुटि होनी चाहिए?
djangofan

3
उदाहरण कमांड लाइन पर अंतःक्रियात्मक रूप से काम करेगा। एक बैच फ़ाइल में उपयोग करने के लिए आप की सभी घटनाओं को बदलने के लिए की जरूरत %के साथ %%
माइक फिट्जपैट्रिक

2
साथ ही, उदाहरण एक अवधि ( .), जैसे मेरे USERPROFILE% फ़ोल्डर वाले फ़ोल्डर नामों को सही ढंग से नहीं संभालता है ।
माइक फिट्जपैट्रिक

1
हां, काम करता है अगर आप '%' को '%%' से बदल दें। अच्छा जवाब। यदि पहले उल्लेख किया गया था तो वह स्वीकृत उत्तर होगा।
djangofan 20

1
जो कुछ भी यह ईश्वर-भयानक बुराई टोना है, मुझे खुशी है कि यह काम करता है। मैं विस्तार-वाक्यविन्यास के अधिकांश से परिचित हूं, लेकिन मैंने इससे पहले कभी भी *इसका इस्तेमाल नहीं देखा है
kayleeFrye_onDeck

30

यदि आप बैच फ़ाइल का वर्तमान स्थान जानना चाहते हैं (और यदि आपका विंडोज बहुत प्राचीन रिलीज़ नहीं है), तो for /?'डॉस बॉक्स' विंडो में टाइप करें । नीचे स्क्रॉल करें। पढ़ें।

आपको पता चलेगा, कि आप अब ( बैच फ़ाइल के भीतर से ) इन चरों को पढ़ सकते हैं :

%0      - as the name how this batchfile was called
%~d0    - as the drive letter where this batchfile is located ('\\' in case of share)
%~p0    - as path (without the drive letter) where this batchfile is located
%~n0    - as filename (without suffix) of this batchfile
%~x0    - as filename's suffix (without filename) of this batchfile
%~a0    - as this batchfile's file attributes
%~t0    - as this batchfile's date+time
%~z0    - as this batchfile's filesize
%~dpnx0 - as this batchfile's fully qualified path+filename
[... and then some more ...]

यह कई मामलों के लिए काम करता है। मान लें, बैचफाइल कहा जाता है mytest.bat। आप इसे विभिन्न तरीकों से कह सकते हैं:

  1. ..\..\to\mytest.bat …………………………… (सापेक्षिक पथ)
  2. d:\path\to\mytest.bat........................... (पूर्ण पथ)
  3. \\fileserver\sharename\mytest.bat... (रिमोट शेयर पर पथ)

... और आपको अपने चरों में हमेशा सही मूल्य मिलेगा।


1
वाह, दिलचस्प रूप से आपका अधिकार पर्याप्त है। कमांड "इको% ~ dp0" मेरी समस्या को हल करता है और इसकी अधिक सुरुचिपूर्ण है।
djangofan 21

5
ठीक है - फिर मुझे '+1' पुरस्कार देने की परवाह है?
कर्ट फ़िफ़ले

नहीं, इस कारण से कि 'के लिए /?' क्या मैं देख रहा था पहली स्पष्ट जगह थी और इसलिए यह जवाब किसी से भी अपेक्षित नहीं है।
djangofan

4
@djangofan: तो आप कहते हैं 'वाह, दिलचस्प है कि आप सही हैं ...' कुछ आप पहले से ही जानते थे ?! एक उत्तर के लिए जो आपके ज्ञान में योगदान नहीं करता है? (आप जानते हैं, '+1' ^ -रो पर क्लिक कर रहा है - यह एक उत्तर को स्वीकार किए जाने से अलग है ....)
कर्ट फ़िफ़ल

1
ऐसा लगता है कि पिछले एक होना चाहिए %~dpnx0, नहीं है?
ल्यूक

15

मुझे व्यक्तिगत रूप से टॉम्स का उत्तर पसंद आया, जब तक कि यह dir नामों में डॉट्स के साथ संघर्ष नहीं किया। इससे मुझे संकेत मिला:

for /f "delims=\" %%a in ("%cd%") do echo topmost dir: %%~nxa

5

टॉम का जवाब अच्छा है, लेकिन अगर आपके पास एक निर्देशिका नाम है जिसमें एक अवधि है (यानी wxwidgets-2.9.4) तो आपको केवल पूरा नाम मिलेगा। तो यह wxwidgets-2.9 ​​के बजाय आउटपुट करेगा क्योंकि .4 को एक एक्सटेंशन के रूप में माना गया है (हाँ, भले ही यह एक निर्देशिका नाम है!)।

पूर्ण आउटपुट नाम प्राप्त करने के लिए आपको एक्सटेंशन को अंत तक जोड़ना होगा:

FOR %I IN (.) DO Echo %~nI%~xI

और बैच फ़ाइल मोड में:

FOR %%I IN (.) DO Echo %%~nI%%~xI

या इसके बजाय, बैच फ़ाइल में एक चर सेट करें:

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI

4

एक अन्य तरीका है:

set "MyPath=%~dpnx0" & call set "MyPath=%%MyPath:\%~nx0=%%" 
echo MyPath=%MyPath%  

यह "के साथ काम करता है।" और पथनाम में रिक्त स्थान

यह क्या करता है?

  1. पूरे फ़ाइलनाम (ड्राइवलैटर-पथ-फ़ाइल नाम-एक्सटेंशन) को MyPathवार में डालें

  2. MyPathvar से फ़ाइल नाम और एक्सटेंशन निकालें

यह UNC पाथ्स के साथ भी काम करता है। यदि आपको पथ के अंत में बैकस्लैश की आवश्यकता है। दूसरे सेट कमांड में \बाद MyPathको निकालें , जैसे।

set "MyPath=%%MyPath:%~nx0=%%"

1
तो यह कैसे अलग है%~dp0
अमित नायडू

4

आप एक चर में वर्तमान dir प्राप्त कर सकते हैं। एक लाइन:

set a=%cd%

इससे जाँच करें

echo %a%

6
वह वर्तमान निर्देशिका नाम चाहता है, संपूर्ण पथ नहीं, और == cd के रूप में, आप% cd% का भी उपयोग कर सकते हैं।
विरोधाभास

2

बहुत अासान

for %%d in ("%CD%") do echo %%~nxd

या

set "sPath=."
for %%d in ("%sPath%") do set "sDirName=%%~nxd"

पथ के अंत के बैकलैश से सावधान रहें, इसे अंत के बैकलैश नहीं होना चाहिए।


1

इस धागे में मेरा जवाब यह 3 सरल लाइनों में है:

@echo off
SET "CDIR=%~dp0"
:: for loop requires removing trailing backslash from %~dp0 output
SET "CDIR=%CDIR:~0,-1%"
FOR %%i IN ("%CDIR%") DO SET "PARENTFOLDERNAME=%%~nxi"
ECHO Parent folder: %PARENTFOLDERNAME%
ECHO Full path: %~dp0
pause>nul

1

यह मेरे लिए एक बैच फ़ाइल से काम करता है। यह वर्तमान कार्यशील निर्देशिका नाम लौटाता है।

pushd %1 & for %%i in (.) do @echo %%~ni
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.