2012-02-12 11 views
32

मैं बैच स्क्रिप्टिंग में पूर्ण पथ से फ़ाइल नाम को कैसे विभाजित करूं?बैच में पूर्ण पथ से फ़ाइल नाम को कैसे विभाजित करें?

+2

[एक चर से बैच निकालें पथ और फ़ाइल नाम] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/15567809/batch-extract-path-and-filename-from-a-variable) – Gab

उत्तर

60
@echo off 
Set filename=C:\Documents and Settings\All Users\Desktop\Dostips.cmd 
For %%A in ("%filename%") do (
    Set Folder=%%~dpA 
    Set Name=%%~nxA 
) 
echo.Folder is: %Folder% 
echo.Name is: %Name% 

लेकिन मैं इस के लिए ऋण नहीं ले सकते हैं; गूगल http://www.dostips.com/forum/viewtopic.php?f=3&t=409

+1

धन्यवाद ! यह भी मेरे लिए काम किया। मैं एक फाइल से फ़ोल्डर्स की एक सूची में पढ़ रहा हूं और उन्हें स्वरूपित कर रहा हूं। मैंने इसका इस्तेमाल किया: "के लिए/एफ" टोकन = 1 delims = "%% ए में (list_of_files.txt) करें (" –

+0

यह दिखाने के लिए अच्छा हो सकता है कि फ़ाइल नाम कैसे प्राप्त करें। (एक्सटेंशन के बिना।) – Vaccano

+2

% ~ एनआई -% 1 को केवल फ़ाइल नाम में विस्तारित करता है <- teh DOS "for -help" आउटपुट से सीधे लिया जाता है। –

0

मुझे बैच फ़ाइलों के बारे में इतना कुछ पता नहीं है, लेकिन क्या आपके पास होम निर्देशिका से कॉपी की गई पूर्व-निर्मित बैच फ़ाइल नहीं हो सकती है जो आपके पास है जो फाइलों के नामों की एक सूची वापस कर देगी नाम?

यहां एक लिंक है जो मुझे लगता है कि पूर्व-निर्मित बैच फ़ाइल बनाने में सहायक हो सकता है।

http://www.ericphelps.com/batch/lists/filelist.htm

4
@echo off 
Set filename="C:\Documents and Settings\All Users\Desktop\Dostips.cmd" 
call :expand %filename% 
:expand 
set filename=%~nx1 
echo The name of the file is %filename% 
set folder=%~dp1 
echo It's path is %folder% 
0

ऊपर पीट उदाहरण से जारी रखते हुए, cmd विंडो में सीधे यह करने के लिए, एक भी % का उपयोग पर इस पाया, जैसे:

cd c:\test\folder A
for %X in (*)do echo %~nxX

(नोट desktop.ini की तरह है कि विशेष फ़ाइलों नहीं दिखाया जाएगा)

यह भी >> का उपयोग कर एक फाइल करने के लिए उत्पादन रीडायरेक्ट करने के लिए संभव है:।

cd c:\test\folder A
for %X in (*)do echo %~nxX>>c:\test\output.txt

कोई वास्तविक उदाहरण के लिए, यह सोचते हैं आप फ़ोल्डर-बी (गैर पुनरावर्ती) फ़ोल्डर-ए से सभी फ़ाइलों लड़ी हैं:

cd c:\test\folder A 
for %X in (*)do robocopy . "c:\test\folder B" "%~nxX" /dcopy:dat /copyall /v>>c:\test\output.txt

और सभी फ़ोल्डरों के लिए (रिकर्सिवली):

किसी भी घटक (जैसे, file.ext) करने के लिए: (\ अस्थायी \ my.bat जैसे, ग)
cd c:\test\folder A 
for /d %X in (*)do robocopy "%X" "C:\test\folder B\%X" /e /copyall /dcopy:dat /v>>c:\test\output2.txt
+0

इसका उपयोग करते समय मैंने अभी खोज की है कि यदि आप इन तकनीकों का उपयोग रोबोकॉपी के साथ करते हैं तो आपको स्रोत निर्देशिका में अंतिम बैकस्लैश को हटाने के लिए भी याद रखना होगा। यह उपयोगी होगा यदि कोई उदाहरण था जो स्रोत के रूप में '% ~ dpX' का उपयोग करता है। – Annan

12

पूरी तरह से योग्य पथ नाम से एक फ़ाइल नाम पार्स।

कोड की एकल पंक्ति:

For %%A in ("C:\Folder1\Folder2\File.ext") do (echo %%~fA) 

आप बाहर बदल सकते हैं "C: \ Folder1 \ Folder2 \ file.ext" किसी भी पूरा पथ और बदलाव के लिए "%% ~ एफए" किसी भी अन्य विकल्प के लिए आपको "के लिए" चलकर मिल जाएगा? कमांड प्रॉम्प्ट पर।

सविस्तार कोड

set "filename=C:\Folder1\Folder2\File.ext" 
For %%A in ("%filename%") do (
    echo full path: %%~fA 
    echo directory: %%~dA 
    echo path: %%~pA 
    echo file name only: %%~nA 
    echo extension only: %%~xA 
    echo expanded path with short names: %%~sA 
    echo attributes: %%~aA 
    echo date and time: %%~tA 
    echo size: %%~zA 
    echo drive + path: %%~dpA 
    echo name.ext: %%~nxA 
    echo full path + short name: %%~fsA) 

स्टैंडअलोन बैच स्क्रिप्ट
सी के रूप में सहेजें: \ cmd \ ParseFn.cmd

सी जोड़ें: \ cmd अपने पथ वातावरण चर को और आप सभी को पुन: प्रयोज्य बैच स्क्रिप्ट स्टोर करने के लिए इसका इस्तेमाल करते हैं।

@echo off 
@echo ::___________________________________________________________________:: 
@echo ::                 :: 
@echo ::        ParseFn        :: 
@echo ::                 :: 
@echo ::       Chris Advena       :: 
@echo ::___________________________________________________________________:: 
@echo. 

:: 
:: Process arguements 
:: 
if "%~1%"=="/?" goto help 
if "%~1%"=="" goto help 
if "%~2%"=="/?" goto help 
if "%~2%"=="" (
    echo !!! Error: ParseFn requires two inputs. !!! 
    goto help) 

set in=%~1% 
set out=%~2% 
:: echo "%in:~3,1%" "%in:~0,1%" 
if "%in:~3,1%"=="" (
    if "%in:~0,1%"=="/" (
    set in=%~2% 
    set out=%~1%) 
) 

:: 
:: Parse filename 
:: 
set "ret=" 
For %%A in ("%in%") do (
    if "%out%"=="/f" (set ret=%%~fA) 
    if "%out%"=="/d" (set ret=%%~dA) 
    if "%out%"=="/p" (set ret=%%~pA) 
    if "%out%"=="/n" (set ret=%%~nA) 
    if "%out%"=="/x" (set ret=%%~xA) 
    if "%out%"=="/s" (set ret=%%~sA) 
    if "%out%"=="/a" (set ret=%%~aA) 
    if "%out%"=="/t" (set ret=%%~tA) 
    if "%out%"=="/z" (set ret=%%~zA) 
    if "%out%"=="/dp" (set ret=%%~dpA) 
    if "%out%"=="/nx" (set ret=%%~nxA) 
    if "%out%"=="/fs" (set ret=%%~fsA) 
) 
echo ParseFn result: %ret% 
echo. 

goto end 
:help 
@echo off 
:: @echo ::___________________________________________________________________:: 
:: @echo ::                 :: 
:: @echo ::       ParseFn Help       :: 
:: @echo ::                 :: 
:: @echo ::       Chris Advena       :: 
:: @echo ::___________________________________________________________________:: 
@echo. 
@echo ParseFn parses a fully qualified path name (e.g., c:\temp\my.bat) 
@echo into the requested component, such as drive, path, filename, 
@echo extenstion, etc. 
@echo. 
@echo Syntax: /switch filename 
@echo where, 
@echo filename is a fully qualified path name including drive, 
@echo folder(s), file name, and extension 
@echo. 
@echo Select only one switch: 
@echo  /f - fully qualified path name 
@echo  /d - drive letter only 
@echo  /p - path only 
@echo  /n - file name only 
@echo  /x - extension only 
@echo  /s - expanded path contains short names only 
@echo  /a - attributes of file 
@echo  /t - date/time of file 
@echo  /z - size of file 
@echo  /dp - drive + path 
@echo  /nx - file name + extension 
@echo  /fs - full path + short name 
@echo. 

:end 
:: @echo ::___________________________________________________________________:: 
:: @echo ::                 :: 
:: @echo ::       ParseFn finished       :: 
:: @echo ::___________________________________________________________________:: 
:: @echo. 
संबंधित मुद्दे