निर्देशिका के सभी फाइलों को 'लूप' के लिए प्रयोग करके डाइरेक्ट करें


352

मैं forलूप का उपयोग करके डायरेक्टरी में प्रत्येक फ़ाइल पर कैसे पुनरावृति कर सकता हूं ?

और मैं कैसे बता सकता हूं कि एक निश्चित प्रविष्टि एक निर्देशिका है या अगर यह सिर्फ एक फ़ाइल है?


1
यह मानकर कि आपने डिफ़ॉल्ट विंडो शेल का उपयोग किया है, मैंने आपके पोस्ट को थोड़ी और स्पष्टता के लिए रिट्वीट किया है
डेविड श्मिट

2
कृपया यह भी निर्दिष्ट करें कि आप किस विंडोज का उपयोग कर रहे हैं।
जॉप

1
इसे दो अलग-अलग प्रश्नों में विभाजित किया जाना चाहिए क्योंकि वे एक-दूसरे से स्वतंत्र हैं।
ज्यूलैल्गॉन

जवाबों:


492

यह वर्तमान निर्देशिका में सभी फाइलों (और केवल फाइलों) को सूचीबद्ध करता है:

for /r %i in (*) do echo %i

यदि आप उस कमांड को बैच फ़ाइल में चलाते हैं तो आपको% संकेतों को दोगुना करने की आवश्यकता है।

for /r %%i in (*) do echo %%i

(साभार @agnul)


73
यदि आप इस पुनरावृत्ति का उपयोग नहीं करना चाहते हैं, तो सुनिश्चित करें कि आप / r
jocull

28
यदि आप मौजूदा निर्देशिका (पुनरावर्ती) में अपने एक्सटेंशन के साथ केवल फ़ाइल नाम (पूर्ण पथ नहीं) प्रतिध्वनित करना चाहते हैं, तो आप इसे इस तरह कर सकते हैं for /r %i in (*) do ( echo %~nxi ):। यह धागा वास्तव में बहुत उपयोगी हो सकता है: stackoverflow.com/questions/112055/…
Sk8erPeter

2
@Vaccano हाँ, डू के बाद, कोष्ठक का उपयोग करें। Ie do (echo% i & del% i)। आप कई कमांड के लिए "&" के बजाय "एंटर" का भी उपयोग कर सकते हैं।
जय

2
यदि आप प्रतिध्वनि की बजाय प्रति / चाल जैसी आज्ञाओं का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप मार्ग को ठीक से उद्धृत करते हैं। for / r %% i में (*) do echo "%% i"
Soundararajan

2
आपको स्पष्ट रूप से एकल अक्षर चर नामों का उपयोग करने की आवश्यकता है।
अल्वारो गोंजालेज

214

के माध्यम से Iterate ...

  • ... वर्तमान dir में फ़ाइलें: for %f in (.\*) do @echo %f
  • ... वर्तमान dir में उपखंड: for /D %s in (.\*) do @echo %s
  • ... वर्तमान और सभी उपखंडों में फाइलें: for /R %f in (.\*) do @echo %f
  • ... वर्तमान और सभी उपखंडों में उप-विभाग: for /R /D %s in (.\*) do @echo %s

दुर्भाग्य से मुझे एक ही समय में फ़ाइलों और उप-स्तरों पर पुनरावृति करने का कोई तरीका नहीं मिला।

बहुत अधिक कार्यक्षमता के लिए बस अपने बैश के साथ साइबरविन का उपयोग करें ।

इसके अलावा: क्या आपने ध्यान दिया, कि एमएस विंडोज की बिल्डिन सहायता cmd के कमांड लाइन सिंटैक्स के विवरणों के लिए एक महान संसाधन है?

यहाँ भी देखें: http://technet.microsoft.com/en-us/library/bb490890.aspx


21
%fileऔर %subdirकेवल एक वर्ण लंबा, यानी हो सकता है %f, %s
फेलिक्स डॉम्बेक

1
'वर्तमान डायर में उप-दल' काम नहीं कर रहा है। मुझे एक त्रुटि मिलती है: इस समय अप्रत्याशित था
Migrate2Lazarus मेरी प्रोफ़ाइल

78

लूप के लिए प्रत्येक फ़ाइल पर कार्य करने के लिए:

for %%f in (directory\path\*) do ( something_here )

मेरे मामले में मैं भी फ़ाइल सामग्री, नाम, आदि चाहता था।

इससे कुछ समस्याएं पैदा हुईं और मुझे लगा कि मेरा उपयोग मामला मदद कर सकता है। यहाँ एक लूप है जो निर्देशिका में प्रत्येक '.txt' फ़ाइल से जानकारी पढ़ता है और आपको इसके साथ कुछ करने की अनुमति देता है (उदाहरण के लिए सेट)।

@ECHO OFF
setlocal enabledelayedexpansion
for %%f in (directory\path\*.txt) do (
  set /p val=<%%f
  echo "fullname: %%f"
  echo "name: %%~nf"
  echo "contents: !val!"
)

* सीमा: val <= %% f को केवल फ़ाइल की पहली पंक्ति मिलेगी।


18
आह, एक बहु-पंक्ति उदाहरण। उसके लिए धन्यवाद!
Nyerguds

@ अरोन वोटर एक पाश को कैसे समाप्त करें?
nijogeorgep

@nijogeorgep आपको लूप को "समाप्त" करने की आवश्यकता नहीं है। मेरे उदाहरण में, कोष्ठक के अंदर सब कुछ, (गूंज, आदि), निर्देशिका में प्रत्येक '* .txt' फ़ाइल के लिए एक बार चलाया जाएगा। मुझे लगता है कि आप जिस उत्तर की तलाश कर रहे हैं, वह यहाँ बेहतर तरीके से समझाया जा सकता है: stackoverflow.com/questions/1355791/…
हारून वोटरे

@Aaron Votre मैं स्क्रिप्ट का उपयोग करके कुछ मावेन कमांड चलाने की कोशिश कर रहा था, लेकिन यह अनंत लूप के रूप में चल रहा था, इसलिए मैंने इसके लिए कहा। अब खरीदें मैंने अपने पाश से एक निकास जोड़ा और अपने मुद्दे को तय किया
nijogeorgep

@nijogeorgep खुशी है कि आप इसे समझ गए!
हारून वोटरे

57

FORकमांड लाइन से और बैच फ़ाइल से चलने के बीच एक सूक्ष्म अंतर है । एक बैच फ़ाइल में, आपको %प्रत्येक चर संदर्भ के सामने दो अक्षर रखने होंगे ।

एक कमांड लाइन से:

FOR %i IN (*) DO ECHO %i

एक बैच फ़ाइल से:

FOR %%i IN (*) DO ECHO %%i

44

यह लूप के लिए एक डायरेक्टरी में सभी फाइलों को सूचीबद्ध करेगा।

pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd

"डेलिम्स =" इसमें रिक्त स्थान के साथ लंबे फ़ाइलनाम दिखाने के लिए उपयोगी है ...।

'/ b "केवल नाम दिखाते हैं, आकार दिनांक आदि नहीं।

डायर के तर्क के बारे में जानने के लिए कुछ बातें।

  • "/ A" के किसी भी उपयोग में छिपी और सिस्टम विशेषताओं सहित सब कुछ सूचीबद्ध होगा।
  • "" विज्ञापन "केवल उपनिर्देशिका दिखाएगा, जिसमें छिपे और सिस्टम वाले भी शामिल हैं।
  • "विज्ञापन" तर्क सामग्री को 'डी'ऑनरी विशेषता के साथ समाप्त करता है।
  • "" adhs "सब कुछ दिखाएगा, लेकिन 'D'irectory,' H'idden 'S'ystem विशेषता वाली प्रविष्टियाँ।

यदि आप इसका उपयोग कमांडलाइन पर करते हैं, तो "%" हटा दें।

उम्मीद है की यह मदद करेगा।


10

% 1 पहले तर्क को पास करता है और इसे पुनरावृत्ति में उपयोग नहीं किया जा सकता है।

इसे इस्तेमाल करे:

@echo off
for %%i in (*.*) do echo %%i

आप सही हे। मैंने तत्काल सिंटैक्स की जांच करने के लिए तत्काल मोड में कोशिश की है और मापदंडों के बारे में भूलकर सीधे उत्तर में लाइन पेस्ट किया है :-)
Axeman

5
for %1 in (*.*) do echo %1

पूर्ण गाइड के लिए cmd में "HELP FOR" आज़माएं

यह XP कमांड के लिए गाइड है। http://www.ss64.com/nt/


4

उन सभी फ़ाइलों और फ़ोल्डरों के माध्यम से पुनरावृति करने के लिए जिनका आप उपयोग कर सकते हैं

for /F "delims=" %%a in ('dir /b /s') do echo %%a

सभी फ़ोल्डरों के माध्यम से पुनरावृत्ति करने के लिए न केवल फ़ाइलों के साथ, फिर आप उपयोग कर सकते हैं

for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a

जहां /sअसीमित गहराई में निर्देशिका ट्री में सभी परिणाम देंगे। /sयदि आप उस फ़ोल्डर की सामग्री के माध्यम से पुनरावृत्ति करना चाहते हैं तो आप उनका उप फ़ोल्डर नहीं छोड़ सकते

पुनरावृत्ति में खोज को लागू करना

किसी विशेष नामित फ़ाइलों और फ़ोल्डरों के माध्यम से पुनरावृत्ति करने के लिए आप नाम का खोज कर सकते हैं और लूप के लिए उपयोग कर सकते हैं

for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a

किसी विशेष नाम वाले फ़ोल्डर / निर्देशिका के माध्यम से पुनरावृत्ति करने के लिए और फ़ाइलों के लिए नहीं , फिर /ADउसी कमांड में उपयोग करें

for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a

4

जब तक मुझे यह संदर्भ नहीं मिला, तब तक मुझे एक निरपेक्ष मार्ग के साथ काम करने का उत्तर देने में परेशानी हुई: https://ss64.com/nt/for_r.html

निम्न उदाहरण पूर्ण पथ द्वारा दी गई निर्देशिका में सभी फ़ाइलों के माध्यम से लूप करता है।

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)

3

निम्न कोड वर्तमान निर्देशिका में "AllFilesInCurrentDirectorylist.txt" नाम से एक फ़ाइल बनाता है , जिसमें वर्तमान निर्देशिका में सभी फ़ाइलों (केवल फ़ाइलों) की सूची होती है। इसकी जांच - पड़ताल करें

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

3

यह फोरफाइल्स कमांड का उपयोग भी कर सकता है :

forfiles /s 

और यह भी जांचें कि क्या यह एक निर्देशिका है

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"

@isdir==trueजरूरत है@isdir==TRUE
psyklopz

2

मैं vbscript (Windows स्क्रिप्टिंग होस्ट) का उपयोग करूंगा, क्योंकि बैच में मुझे यकीन है कि आप यह नहीं बता सकते कि एक नाम एक फ़ाइल या एक निर्देशिका है।

Vbs में, यह कुछ इस तरह हो सकता है:

Dim fileSystemObject
Set fileSystemObject = CreateObject("Scripting.FileSystemObject")

Dim mainFolder
Set mainFolder = fileSystemObject.GetFolder(myFolder)

Dim files
Set files = mainFolder.Files

For Each file in files
...
Next

Dim subFolders
Set subFolders = mainFolder.SubFolders

For Each folder in subFolders
...
Next

MSDN पर FileSystemObject की जाँच करें ।


मैंने ऐसा करने के लिए पर्ल का इस्तेमाल किया होगा। दुर्भाग्य से, यह मेरे ऊपर नहीं है।
Vhaerun

कुछ पुराना आवेदन? दुख की बातें।
बीरी

एक बेवकूफ डेवलपर ने बैच फ़ाइलों को देखा और सोचा कि वे हमारी सभी समस्याओं का इलाज हैं।
वरुण

1
पर्ल पर विंडोज स्क्रिप्ट होस्ट (डब्ल्यूएसएच) का एक लाभ यह होगा कि डब्ल्यूएसएच विंडोज के सभी संस्करणों के साथ पहले से इंस्टॉल आता है, जबकि पर्ल को अलग से इंस्टॉल करने की आवश्यकता होगी, जो सभी मामलों में संभव विकल्प नहीं हो सकता है।
परमप्रीत भट्ट

2

मैं फ़ाइल नामों को प्राप्त करने के लिए / L विकल्प के साथ xcopy कमांड का उपयोग करता हूं। इसलिए यदि आप या तो एक निर्देशिका या उपनिर्देशिका की सभी फाइलों को प्राप्त करना चाहते हैं, तो आप कुछ ऐसा कर सकते हैं:

for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a

मैं सिर्फ c: \ का उपयोग गंतव्य के रूप में करता हूं क्योंकि यह हमेशा विंडोज़ सिस्टम पर मौजूद होता है और यह कॉपी नहीं होता है इसलिए यह कोई फर्क नहीं पड़ता। यदि आप चाहते हैं कि उपनिर्देशिकाएं भी अंत में सिर्फ / s विकल्प का उपयोग करें। यदि आपको अन्य कारणों से उनकी आवश्यकता हो तो आप xcopy के अन्य स्विच का भी उपयोग कर सकते हैं।


2

यदि कोई फ़ाइल निर्देशिका है, तो यह जाँचने का प्रयास करें:

FOR /F "delims=" %I IN ('DIR /B /AD "filename" 2^>^&1 ^>NUL') DO IF "%I" == "File Not Found" ECHO Not a directory

यह केवल आपको बताएगा कि क्या कोई फ़ाइल निर्देशिका नहीं है, जो फ़ाइल के मौजूद न होने पर भी सत्य होगी, इसलिए यदि आवश्यक हो तो पहले उस के लिए जाँच करना सुनिश्चित करें। कैरेट (^) का उपयोग रीडायरेक्ट प्रतीकों से बचने के लिए किया जाता है और फ़ाइल लिस्टिंग आउटपुट को NUL में रीडायरेक्ट किया जाता है ताकि इसे प्रदर्शित होने से रोका जा सके, जबकि DIR लिस्टिंग के एरर आउटपुट को आउटपुट पर रीडायरेक्ट किया जाता है ताकि आप DIR के संदेश के विरुद्ध परीक्षण कर सकें - फ़ाइल नहीं मिली। "।


2

इसे इस्तेमाल करे:

::Example directory
set SetupDir=C:\Users

::Loop in the folder with "/r" to search in recursive folders, %%f being a loop ::variable 
for /r "%SetupDir%" %%f in (*.msi *.exe) do set /a counter+=1

echo there are %counter% files in your folder

यह अपनी निर्देशिका (। और उप निर्देशिका में) .msi और .exe फ़ाइलों को गिनता है। इसलिए यह फोल्डर और फाइलों के बीच निष्पादन योग्य के रूप में भी अंतर करता है।

यदि आपको लूप में अन्य फ़ाइलों को फ़िल्टर करने की आवश्यकता है, तो बस एक एक्सटेंशन (.pptx .docx ..) जोड़ें


1

मेरे मामले में मुझे एक अस्थायी फ़ोल्डर के नीचे सभी फ़ाइलों और फ़ोल्डरों को हटाना पड़ा। तो यह है कि मैं इसे कैसे कर समाप्त हो गया। मुझे फाइल के लिए दो और एक फोल्डर के लिए दो लूप चलाने थे। यदि फ़ाइलों या फ़ोल्डरों के नाम में जगह है तो आपको "" का उपयोग करना होगा

cd %USERPROFILE%\AppData\Local\Temp\
rem files only
for /r %%a in (*) do (
echo deleting file "%%a" ...
if exist "%%a" del /s /q "%%a"
)
rem folders only
for /D %%a in (*) do (
echo deleting folder "%%a" ...
if exist "%%a" rmdir /s /q "%%a"
)

1

यहाँ कोड में टिप्पणियों के साथ मेरा जाना है।

मैं बस biatch कौशल द्वारा brushing हूँ तो किसी भी गंभीर त्रुटियों को क्षमा करें।

मैंने एक समाधान में सभी को लिखने की कोशिश की सबसे अच्छा मैं थोड़ा संशोधन के साथ कर सकता हूं जहां उपयोगकर्ता को इसकी आवश्यकता होती है।

कुछ महत्वपूर्ण सूचनाएं: बस चर बदलने recursiveके लिए FALSEअगर आप केवल जड़ निर्देशिका फ़ाइलों और फ़ोल्डरों संसाधित चाहते हैं। अन्यथा, यह सभी फ़ोल्डर्स और फ़ाइलों के माध्यम से जाता है।

सी और सी सबसे स्वागत ...

@echo off
title %~nx0
chcp 65001 >NUL
set "dir=c:\users\%username%\desktop"
::
:: Recursive Loop routine - First Written by Ste on - 2020.01.24 - Rev 1
::
setlocal EnableDelayedExpansion
rem THIS IS A RECURSIVE SOLUTION [ALBEIT IF YOU CHANGE THE RECURSIVE TO FALSE, NO]
rem By removing the /s switch from the first loop if you want to loop through
rem the base folder only.
set recursive=TRUE
if %recursive% equ TRUE ( set recursive=/s ) else ( set recursive= )
endlocal & set recursive=%recursive%
cd /d %dir%
echo Directory %cd%
for %%F in ("*") do (echo    → %%F)                                 %= Loop through the current directory. =%
for /f "delims==" %%D in ('dir "%dir%" /ad /b %recursive%') do (    %= Loop through the sub-directories only if the recursive variable is TRUE. =%
  echo Directory %%D
  echo %recursive% | find "/s" >NUL 2>NUL && (
    pushd %%D
    cd /d %%D
    for /f "delims==" %%F in ('dir "*" /b') do (                      %= Then loop through each pushd' folder and work on the files and folders =%
      echo %%~aF | find /v "d" >NUL 2>NUL && (                        %= This will weed out the directories by checking their attributes for the lack of 'd' with the /v switch therefore you can now work on the files only. =%
      rem You can do stuff to your files here.
      rem Below are some examples of the info you can get by expanding the %%F variable.
      rem Uncomment one at a time to see the results.
      echo    → %%~F           &rem expands %%F removing any surrounding quotes (")
      rem echo    → %%~dF          &rem expands %%F to a drive letter only
      rem echo    → %%~fF          &rem expands %%F to a fully qualified path name
      rem echo    → %%~pF          &rem expands %%A to a path only
      rem echo    → %%~nF          &rem expands %%F to a file name only
      rem echo    → %%~xF          &rem expands %%F to a file extension only
      rem echo    → %%~sF          &rem expanded path contains short names only
      rem echo    → %%~aF          &rem expands %%F to file attributes of file
      rem echo    → %%~tF          &rem expands %%F to date/time of file
      rem echo    → %%~zF          &rem expands %%F to size of file
      rem echo    → %%~dpF         &rem expands %%F to a drive letter and path only
      rem echo    → %%~nxF         &rem expands %%F to a file name and extension only
      rem echo    → %%~fsF         &rem expands %%F to a full path name with short names only
      rem echo    → %%~dp$dir:F    &rem searches the directories listed in the 'dir' environment variable and expands %%F to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string
      rem echo    → %%~ftzaF       &rem expands %%F to a DIR like output line
      )
      )
    popd
    )
  )
echo/ & pause & cls
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.