सीएमडी के साथ फ़ाइल पथ से फ़ोल्डर पथ कैसे प्राप्त करें


151

मुझे उस फ़ोल्डर को पथ की आवश्यकता है जिसमें cmd ​​फ़ाइल है। % 0 के साथ मैं फ़ाइल नाम प्राप्त कर सकता हूं। लेकिन फ़ोल्डर का नाम कैसे प्राप्त करें?

c: \ temp \ test.cmd >> test.cmd

PS मेरी वर्तमान निर्देशिका! = स्क्रिप्ट का फ़ोल्डर।

जवाबों:


310

फ़ोल्डर नाम और ड्राइव के लिए, आप उपयोग कर सकते हैं:

echo %~dp0

आप विभिन्न संशोधक का उपयोग करके बहुत अधिक जानकारी प्राप्त कर सकते हैं:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file

The modifiers can be combined to get compound results:
%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only

यह "के लिए /?" से एक कॉपी पेस्ट है प्रॉम्प्ट पर कमांड। आशा करता हूँ की ये काम करेगा।

सम्बंधित

शीर्ष 10 डॉस बैच युक्तियां (हां, डॉस बैच ...) बैचपरम्स.बैट ( जिस्ट के रूप में स्रोत से लिंक ) दिखाती है :

C:\Temp>batchparams.bat c:\windows\notepad.exe
%~1     =      c:\windows\notepad.exe
%~f1     =      c:\WINDOWS\NOTEPAD.EXE
%~d1     =      c:
%~p1     =      \WINDOWS\
%~n1     =      NOTEPAD
%~x1     =      .EXE
%~s1     =      c:\WINDOWS\NOTEPAD.EXE
%~a1     =      --a------
%~t1     =      08/25/2005 01:50 AM
%~z1     =      17920
%~$PATHATH:1     =
%~dp1     =      c:\WINDOWS\
%~nx1     =      NOTEPAD.EXE
%~dp$PATH:1     =      c:\WINDOWS\
%~ftza1     =      --a------ 08/25/2005 01:50 AM 17920 c:\WINDOWS\NOTEPAD.EXE

ठंडा। क्या मुझे किसी और के विकी पोस्ट को संशोधित करने के लिए एक विशेष स्कोर की आवश्यकता है?
वाडीह एम।

@Wadih M .: आम तौर पर उपयोगी लिंक stackoverflow.com/questions/18557/…
jfs

@Wadih M .: विशेष रूप से stackoverflow.com/questions/130654/…
jfs

@Wadih M .: उपरोक्त लिंक से: "+750 समुदाय को संपादित करने के लिए 'विकि संपादन योग्य' पोस्ट"
jfs

इसलिए यदि आप स्क्रिप्ट के स्थान पर कार्य निर्देशिका को सेट करने के लिए एक cmd स्क्रिप्ट चाहते हैं: cd /d "%~dp0"( stackoverflow.com/questions/4451668 से )
Nigel Touch

52

स्वीकृत उत्तर सहायक है, लेकिन यह तुरंत स्पष्ट नहीं है कि यदि आप मानों में पारित नहीं कर रहे हैं, तो एक मार्ग से फ़ाइल नाम कैसे प्राप्त करें। मैं इसे इस थ्रेड से बाहर निकालने में सक्षम था, लेकिन अगर कोई ऐसा भाग्यशाली नहीं है, तो यहां बताया गया है कि यह कैसे किया जाता है:

@echo off
setlocal enabledelayedexpansion enableextensions

set myPath=C:\Somewhere\Somewhere\SomeFile.txt
call :file_name_from_path result !myPath!
echo %result%
goto :eof

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)

:eof
endlocal

अब :file_name_from_pathफ़ंक्शन का उपयोग मान प्राप्त करने के लिए कहीं भी किया जा सकता है, न कि केवल तर्कों में पारित करने के लिए। यह बेहद मददगार हो सकता है अगर तर्कों को अनिश्चित क्रम में फ़ाइल में पारित किया जा सकता है या पथ को फ़ाइल में पारित नहीं किया जाता है।


वाह कमाल है! तो विंडोज़ बैच फ़ाइलें उसी फ़ाइल के अंदर फ़ंक्शन का समर्थन करती हैं, कितना उपयोगी है! यह कब से संभव था?
ल्यूक

2
मुझे पसंद है कि आप संदर्भ (जैसा है) और मूल्य के अनुसार ("एस!") के साथ दोनों चर पास कर सकते हैं। ठीक है, आपके पास शायद "स्थानीय" चर और कॉल स्टैक नहीं है ... लेकिन हे: यह सब के बाद एक cmd स्क्रिप्ट है, यह वैसे भी एक बड़ा कदम है;) मैं सहमत हूं, एक फ़ाइल के अंदर सामान का विभाजन बहुत अधिक उपयोगी है इसे कई फाइलों में विभाजित करने की तुलना में :)
ल्यूक

1
मुझे लगता है कि "गोटो: ईओफ़" को "गोटो ईओफ़" होना चाहिए .. बिना कोलन के .. जैसा कि यह मेरे लिए टूट रहा था।
Kh:३५ पर एक खुद्दारी

2
इसे भी देखें: ss64.com/nt/syntax-args.html - %~dp1केवल ड्राइव और पथ के लिए उपयोग करें ।
एंड्रयू

2
@AKhudairy सही है: ss64.com/nt/goto.html कोलन के साथ गोटो एंडलोक को छोड़ देता है (और कुछ भी जिसे आप बाद में रखते हैं, जैसे एक पॉज़)। अगर आपके रास्ते में जगह है (या उद्धरण मेरेपाथ का हिस्सा है) इसके अलावा आपको "चारों ओर जोड़ने की जरूरत है!myPath!
रिक

8

इन चर को निर्दिष्ट करने के लिए, सुनिश्चित करें कि सामने या बराबर चिह्न के बाद रिक्त स्थान न जोड़ें:

set filepath=%~dp1
set filename=%~nx1

तब आपके पास कोई मुद्दा नहीं होना चाहिए।


5

मामले में कोई भी वैकल्पिक विधि चाहता है ...

यदि यह पथ में अंतिम उपनिर्देशिका है, तो आप इस एक-लाइनर का उपयोग कर सकते हैं:

cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s

यह निम्नलिखित लौटाएगा:

c:\directory\subdirectory

.... पिछली निर्देशिका में वापस चला जाता है। / विज्ञापन केवल निर्देशिकाओं को दर्शाता है / b एक नंगे प्रारूप की सूची है / जिसमें सभी उपनिर्देशिकाएँ शामिल हैं। इसका उपयोग निर्देशिका के पूर्ण पथ को प्रिंट करने के लिए किया जाता है।


यह संभवतः वर्तमान निर्देशिका के खिलाफ काम करता है, न कि एक निर्देशिका जहां स्क्रिप्ट फ़ाइल स्थित है।
माइक चली

4

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

FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
  7z.exe x %%i -aoa -o%%i\..
) 

%% मैं एक पूर्ण फ़ाइल नाम पथ था और% ii \ _ केवल मूल फ़ोल्डर लौटाता है।

आशा करता हूँ की ये काम करेगा।


जल्दी और गन्दी। मुझे वह पसंद है! कभी नहीं सोचा था कि आप ठंड में "\" के साथ एक फ़ाइल पथ का विस्तार करते हैं और मूल फ़ोल्डर के साथ समाप्त होते हैं।
ऑलिवर आर।

इसने मेरे लिए Win10: FOR / R "C: \ sourceDir"% I IN (* .gz) DO C: \ 7-Zip64 \ 7z.exe x "% I" -a -o% I \ .. \ "पर काम किया।
b3wii

हाँ! यह इस समस्या के आसपास हो जाता है कि% ~ dp1 (आदि) केवल% 0,% 1,% 2 आदि पर काम करते हैं
आर्टिलियस

3

मामले में Wadih द्वारा स्वीकृत उत्तर आपके लिए काम नहीं आया, कोशिश करें echo %CD%


0

यह कुछ संपादित उदाहरण cmd के साथ एक साथ रखा गया था

@Echo off

Echo ********************************************************
Echo *  ZIP Folder Backup using 7Zip                        *
Echo *  Usage: Source Folder, Destination Drive Letter      *
Echo *  Source Folder will be Zipped to Destination\Backups *
Echo ********************************************************
Echo off

set year=%date:~-4,4%
set month=%date:~-10,2%
set day=%date:~-7,2%
set hour=%time:~-11,2%
set hour=%hour: =0%
set min=%time:~-8,2%

SET /P src=Source Folder to Backup: 
SET source=%src%\*
call :file_name_from_path nam %src%
SET /P destination=Backup Drive Letter:
set zipfilename=%nam%.%year%.%month%.%day%.%hour%%min%.zip
set dest="%destination%:\Backups\%zipfilename%"


set AppExePath="%ProgramFiles(x86)%\7-Zip\7z.exe"
if not exist %AppExePath% set AppExePath="%ProgramFiles%\7-Zip\7z.exe"

if not exist %AppExePath% goto notInstalled

echo Backing up %source% to %dest%

%AppExePath% a -r -tzip %dest% %source%

echo %source% backed up to %dest% is complete!

TIMEOUT 5

exit;

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)


:notInstalled

echo Can not find 7-Zip, please install it from:
echo  http://7-zip.org/

:end
PAUSE
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.