2010-03-07 19 views
12

का उपयोग कर रहा डॉसडॉस बैच पटकथा

पूर्व के लिए

में एक फ़ाइल के लिए मूल निर्देशिका का नाम खोजने की जरूरत है एक विशेष फ़ाइल के लिए मूल निर्देशिका नाम प्राप्त करें।

मान लीजिए इस निर्देशिका

C:\test\pack\a.txt 

मैं एक स्क्रिप्ट जो मुझे फ़ाइल नाम

C:\\>getname.bat  
enter file name: c:\test\pack\a.txt 

अब स्क्रिप्ट फ़ाइल का सिर्फ माता-पिता का नाम लौटना चाहिए पूछता है।

pack   

और फ़ाइल के पूरे पैरेंट पथ नहीं।

c:\test\pack 

उत्तर

9

this सवाल

@echo OFF 
set mydir="%~p1" 
SET mydir=%mydir:\=;% 

for /F "tokens=* delims=;" %%i IN (%mydir%) DO call :LAST_FOLDER %%i 
goto :EOF 

:LAST_FOLDER 
if "%1"=="" (
    @echo %LAST% 
    goto :EOF 
) 

set LAST=%1 
SHIFT 

goto :LAST_FOLDER
+0

धन्यवाद .. यू आर प्रतिभा :) .. पूरी तरह से काम करता है –

+0

मैं नहीं देखता कि यह कैसे काम कर सकता है। % ~ पी 1 मेरे लिए काम नहीं करता है। यह केवल% ~ dp0 या% ~ p0 के साथ काम करता है। – djangofan

+0

@djangofan स्क्रिप्ट एक तर्क के रूप में पथ लेता है और पथ का निर्देशिका नाम देता है। – asdfg

1

आप एक VBScript का उपयोग कर सकते है, जैसे के रूप में getpath.vbs

Set objFS = CreateObject("Scripting.FileSystemObject") 
Set objArgs = WScript.Arguments 
strFile = objArgs(0) 
WScript.Echo objFS.GetParentFolderName(strFile) 

नीचे बचाने तो कमांड लाइन पर या अपने बैच में, इस

कर देखना
C:\test>cscript //nologo getpath.vbs c:\test\pack\a.txt 
c:\test\pack 

यदि आप बैच विधि चाहते हैं, तो आप for /? देख सकते हैं।

%~fI  - expands %I to a fully qualified path name 
    %~dI  - expands %I to a drive letter only 
    %~pI  - expands %I to a path only 
10

उपरोक्त पहला उत्तर काम नहीं करता है यदि मूल निर्देशिका नाम में कोई स्थान होता है। निम्नलिखित काम करता है:

@echo off 
setlocal 

set ParentDir=%~p1 
set ParentDir=%ParentDir: =:% 
set ParentDir=%ParentDir:\= % 
call :getparentdir %ParentDir% 
set ParentDir=%ParentDir::= % 

echo ParentDir is %ParentDir% 
goto :EOF 

:getparentdir 
if "%~1" EQU "" goto :EOF 
Set ParentDir=%~1 
shift 
goto :getparentdir 

के पैरामीटर के साथ ऊपर कॉलिंग "सी: अंतरिक्ष \ myfile.txt साथ \ अस्थायी \ जनक डिर" निम्न देता है:

>GetParentDir "C:\Temp\Parent Dir With Space\myfile.txt" 
ParentDir is Parent Dir With Space 

ऊपर काम करता है कोलन के साथ रिक्त स्थान की जगह (ये विंडोज पथों में मौजूद नहीं होना चाहिए), फिर रिक्त स्थान के साथ निर्देशिका डिलीमीटर को प्रतिस्थापित करने के लिए अलग-अलग निर्देशिकाएं अलग-अलग तर्कों के रूप में getparentdir को पास की जाती हैं। फंक्शन getparentdir loops जब तक कि यह अंतिम अंतिम तर्क नहीं मिलता है। आखिरकार किसी भी कोलन को रिक्त स्थान से बदल दिया जाता है।

+0

क्या यह काम फ़ाइल नामों के लिए करना संभव है जिसमें अल्पविराम शामिल है? विशेष मामला मुझे पता है, बस सोच रहा है कि यह एक साधारण जोड़ या बहुत अधिक कोड होगा। धन्यवाद – GeorgeCostanza

1

यहां एक तरीका है जो CALL का उपयोग नहीं करता है और मेरा मानना ​​है कि तेज़ है।Based on jeb's splitting function (असफल हो सकता है अगर निर्देशिका का नाम ! शामिल हैं):

SET LAST=%CD% 
SET PARENTNAME=NONE 
cd /D C:\test\pack 
FOR %%I in (%CD%) do SET PARENTNAME=%%~nI 
cd /D %LAST% 
ECHO %PARENTNAME% 

%% ~ नी:: '~ एन' पथ से नाम %% मैं चर में संग्रहीत अर्क

@echo off 

set "mydir=%~p1" 
SET mydir=%mydir:~0,-1% 

setlocal EnableDelayedExpansion 
set LF=^ 


rem ** Two empty lines are required 

for %%L in ("!LF!") DO (
    set "dir_name=!mydir:\=%%L!" 
) 
for /f "delims=" %%P in (""!dir_name!"") do set "dn=%%~P" 
echo %dn% 

exit /b 0 
+0

यह बहुत अच्छा काम करता है। विस्मयादिबोधक बिंदुओं आदि के लिए विशेष मामलों को जोड़ने का एक आसान तरीका है, या डीओएस स्क्रिप्टिंग बहुत सीमित है? – GeorgeCostanza

0

यहाँ एक और उपाय है
सीडी: '/ डी' पैरामीटर डिस्क के बीच स्विच करने के लिए जोड़ा भी

1

मैं दोनों, सरल और पूरी तरह से होना करने के लिए रों djangofan और पागल के जवाब से दृष्टिकोण के इस संयोजन पाया ufficient, जब मेरी स्क्रिप्ट के मूल निर्देशिका को देख: \ foo \ बार \ एक:

set FULL_PATH=%~dp0 
set FULL_PATH=%FULL_PATH:~1,-1% 
for %%i in ("%FULL_PATH%") do set "PARENT_FOLDER=%%~ni" 
echo %PARENT_FOLDER% 

के बाद से आप के बजाय उपयोगकर्ता इनपुट पर काम करना चाहते हैं, तो आप सी की तरह कानूनी रूपों को संभालने के लिए, कुछ न्यूनतम अतिरिक्त कार्य करना है। txt बनाम सी: \ foo \ bar \ a.txt या c: /foo/bar/a.txt। यह तो आप के लिए काम कर सकते हैं:

@setlocal 
@echo off 

call:GET_PARENT_FOLDER C:\foo\bar\a.txt 
echo %PARENT_FOLDER% 
call:GET_PARENT_FOLDER C:\foo\bar\\a.txt 
echo %PARENT_FOLDER% 
call:GET_PARENT_FOLDER c:/foo/bar/a.txt 
echo %PARENT_FOLDER% 

pause 
goto:EOF 

:GET_PARENT_FOLDER 
:: Strip the filename, so we get something like this: 'C:\foor\bar\' 
set "_FULL_PATH=%~dp1" 

:: Strips all dangling '\' and '/' in a loop, so the last folder name becomes accessible 
:_STRIP 
if not "%_FULL_PATH:~-1%"=="\" if not "%_FULL_PATH:~-1%"=="/" goto:_STRIP_END 
set "_FULL_PATH=%_FULL_PATH:~1,-1%" 
goto:_STRIP 
:_STRIP_END 

:: We need the context of a for-loop for the special path operators to be available 
for %%i in ("%_FULL_PATH%") do set "PARENT_FOLDER=%%~ni" 

goto:EOF 
7

यह बैच फ़ाइल के पैरेंट फ़ोल्डर पाने के लिए बहुत आसान हो सकता है:

@echo off 
for %%a in ("%~dp0\.") do set "parent=%%~nxa" 
echo %parent% 

और प्रश्न के अनुसार एक फ़ाइल पथ के एक माता पिता के लिए:

@echo off 
for %%a in ("c:\test\pack\a.txt") do for %%b in ("%%~dpa\.") do set "parent=%%~nxb" 
echo %parent% 
+0

मुझे यह एक उपयोगी फ़ोल्डर खोजने के लिए उपयोगी पाया गया था जो बैच फ़ाइल के ऊपर कुछ निर्देशिका थी। फ़ोल्डर स्तर पर जाने के लिए बस '% ~ dp0 \ .' के बाद '\ ..' जोड़ें। उदाहरण: '%% में से एक ("% ~ dp0 \। \ .. \ .. \ .. ")" parent = %% ~ nxa "सेट करें – Toomaja

1

दादामी का विचार अधिक व्यावहारिक पुन: प्रयोज्य कार्यों में काम करता है। _full_path का पहला अक्षर अब भी शामिल है।

set map=D:\test1\test2\test3\test4.txt 
call:get_parent_path "%map%" 
echo full_path is %_full_path% 
call:get_parent_path %_full_path% 
echo full_path is %_full_path% 
call:get_last_path %_full_path% 
echo last_path is %_last_path% 
goto :eof 

:get_parent_path 
set "_full_path=%~dp1" 
:_strip 
if not "%_full_path:~-1%"=="\" if not "%_full_path:~-1%"=="/" goto:_strip_end 
set "_full_path=%_full_path:~0,-1%" 
goto:_strip 
:_strip_end 
exit /b 

:get_last_path 
set "_last_path=%~nx1" 
exit /b 

::result: 
::full_path is D:\test1\test2\test3 
::full_path is D:\test1\test2 
::last_path is test2 
संबंधित मुद्दे