একটি 'ফর' লুপ ব্যবহার করে ডিরেক্টরিতে সমস্ত ফাইলকে আইট্রেট করুন


351

forলুপ ব্যবহার করে ডিরেক্টরিতে প্রতিটি ফাইলের মধ্যে আমি কীভাবে পুনরাবৃত্তি করতে পারি ?

এবং আমি কীভাবে বলতে পারি যে কোনও নির্দিষ্ট এন্ট্রি ডিরেক্টরি বা এটি যদি কেবল একটি ফাইল হয়?


1
আপনার ডিফল্ট উইন্ডোজ শেল বোঝানো মানে ধরে নিয়ে, আমি আপনার পোস্টটি আরও কিছুটা স্পষ্টতার জন্য আবার ফিরিয়ে দিয়েছি
ডেভিড স্মিট

2
আপনি উইন্ডোজ কোন সংস্করণ ব্যবহার করছেন তা দয়া করে নির্দিষ্ট করে দিন।
jop

1
একে অপরের থেকে স্বতন্ত্র হওয়ায় এটিকে দুটি পৃথক প্রশ্নে বিভক্ত করা উচিত।
জুলাইলগন

উত্তর:


491

এটি বর্তমান ডিরেক্টরিতে সমস্ত ফাইল (এবং কেবলমাত্র ফাইলগুলি) তালিকাভুক্ত করে:

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

এছাড়াও আপনি যদি একটি ব্যাচ ফাইলে সেই কমান্ডটি চালনা করেন তবে আপনাকে% চিহ্নগুলি দ্বিগুণ করতে হবে।

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

(ধন্যবাদ @ অগ্নুল)


73
আপনি যদি এটি পুনরাবৃত্তভাবে ব্যবহার করতে না চান, আপনি / আর
জোকল

28
আপনি শুধুমাত্র বর্তমান ডিরেক্টরি (যাও recursively) তাদের এক্সটেনশনগুলি সহ ফাইলের নামের (না পূর্ণ পথ) echo করতে চান তাহলে, আপনি এটি করতে পারে এরকম: for /r %i in (*) do ( echo %~nxi )। এই থ্রেডটি সত্যই কার্যকর হতে পারে: stackoverflow.com/questions/112055/…
Sk8erPeter

2
@ ভ্যাকানকো হ্যাঁ, করার পরে, প্রথম বন্ধনী ব্যবহার করুন। আই ডু (ইকো% i এবং ডেল% i)। আপনি একাধিক কমান্ডের জন্য "&" এর পরিবর্তে "প্রবেশ "ও ব্যবহার করতে পারেন।
জে

2
আপনি যদি প্রতিধ্বনি পরিবর্তে কপি / মুভের মতো কমান্ড ব্যবহার করছেন তবে নিশ্চিত হয়ে নিন যে আপনি পথটি সঠিকভাবে উদ্ধৃত করেছেন। /%% i এর জন্য (*) "%% i"
করান

2
স্পষ্টতই আপনার একক বর্ণের পরিবর্তনশীল নামগুলি ব্যবহার করা দরকার।
vlvaro González

214

এর মাধ্যমে ...

  • ... বর্তমান দির ফাইলগুলি: for %f in (.\*) do @echo %f
  • ... বর্তমান ডিয়ার সাবডিয়ার্স: for /D %s in (.\*) do @echo %s
  • ... বর্তমান এবং সমস্ত সাবডিয়ারগুলিতে ফাইলগুলি: for /R %f in (.\*) do @echo %f
  • ... বর্তমান এবং সমস্ত সাবডিয়ার্সে সাবডিয়ার্স: for /R /D %s in (.\*) do @echo %s

দুর্ভাগ্যক্রমে আমি একই সাথে ফাইল এবং সাবডিয়ারগুলির মাধ্যমে পুনরাবৃত্তি করার কোনও উপায় পাইনি।

আরও অনেক কার্যকারিতার জন্য কেবল স্যাগউইনকে এর ব্যাশ দিয়ে ব্যবহার করুন ।

এগুলি ছাড়াও: আপনি কি খেয়াল করেছেন যে এমএস উইন্ডোজের বিল্টইন সহায়তাটি সিএমডি-র কমান্ড লাইন সিনট্যাক্সের বিবরণের জন্য একটি দুর্দান্ত উত্স?

এছাড়াও এখানে দেখুন: http://technet.microsoft.com/en-us/library/bb490890.aspx


21
%fileএবং %subdirশুধুমাত্র একটি অক্ষর দীর্ঘ, অর্থাত হতে পারে %f, %s
ফেলিক্স ডমবাক

1
'বর্তমান ডিয়ার সাবডিয়ার্স' কাজ করছে না। আমি একটি ত্রুটি পেয়েছি: গুলি এই সময়ে অপ্রত্যাশিত ছিল
মাইগ্রেট 2 লাজার

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!"
)

* সীমাবদ্ধতা: ভাল <= %% f কেবল ফাইলের প্রথম লাইনটি পাবে।


18
আহ, বহু-লাইনের উদাহরণ। তার জন্য ধন্যবাদ!
নায়ারগডস

@ অ্যারন ভোটে কীভাবে লুপ শেষ করবেন?
নিজোজর্পপ

@nijogeorgep আপনার লুপটি "শেষ" করতে হবে না। আমার উদাহরণস্বরূপ, প্রথম বন্ধনীর ভিতরে থাকা সমস্ত কিছু, (প্রতিধ্বনি, ইত্যাদি) ডিরেক্টরিতে প্রতিটি '* .txt' ফাইলের জন্য একবার চালানো হবে। আমি মনে করি আপনি যে উত্তরটির সন্ধান করছেন তা এখানে আরও ভালভাবে ব্যাখ্যা করা যেতে পারে: stackoverflow.com/questions/1355791/…
অ্যারন ভোটে

অ্যারন ভোটে আমি স্ক্রিপ্ট ব্যবহার করে কিছু মেন কমান্ড চালানোর চেষ্টা করছিলাম তবে এটি অসীম লুপ হিসাবে চলছিল, তাই আমি এটি চেয়েছিলাম asked এখনই কিনুন আমি আমার
লুপটিতে

@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

"ডিলিমস =" এর ফাঁকা জায়গাগুলির সাথে দীর্ঘ ফাইলের নামগুলি দেখানোর জন্য দরকারী ...

'/ বি "শুধুমাত্র নামগুলি দেখায়, আকারের তারিখগুলি না ইত্যাদি ..

দির / আর্গুমেন্ট সম্পর্কে কিছু জিনিস জানতে হবে।

  • "/ এ" এর যে কোনও ব্যবহার লুকিয়ে থাকা এবং সিস্টেমের বৈশিষ্ট্য সহ সমস্ত কিছু তালিকাভুক্ত করে।
  • "/ বিজ্ঞাপন" কেবল লুকানো এবং সিস্টেমের সাব-ডাইরেক্টরিগুলি দেখায়।
  • "/ বিজ্ঞাপন" যুক্তি 'ডি'রেক্টরি বৈশিষ্ট্যযুক্ত সামগ্রী মুছে ফেলে।
  • "/ অ্যাডস" সমস্ত কিছু দেখায়, তবে 'ডি'রেক্টরি,' এইচআইভিডন 'সিস্টেমে অ্যাট্রিবিউট দিয়ে প্রবেশ করে।

আপনি যদি কমান্ডলাইনে এটি ব্যবহার করেন তবে একটি "%" অপসারণ করুন।

আশাকরি এটা সাহায্য করবে.


10

% 1 হ'ল প্রথম আর্গুমেন্টটি পাস হয়েছে এবং এটি একটি পুনরুক্তিতে ব্যবহার করা যাবে না।

এটা চেষ্টা কর:

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

তুমি ঠিক বলছো. আমি তাত্ক্ষণিক মোডে চেষ্টা করেছি ফর বাক্য গঠন পরীক্ষা করার জন্য এবং প্যারামিটারগুলি ভুলে
উত্তরটিতে

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

সম্পূর্ণ গাইডের জন্য সেন্টিমিটারে "হেল্প ফর" চেষ্টা করুন

এটি এক্সপি কমান্ডের গাইড। 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" নামে একটি ফাইল তৈরি করে , যা বর্তমান ডিরেক্টরিতে সমস্ত ফাইলের তালিকা (কেবলমাত্র ফাইল) রয়েছে contains এটা দেখ

dir /b /a-d > AllFilesInCurrentDirectorylist.txt


2

আমি vbscript (উইন্ডোজ স্ক্রিপ্টিং হোস্ট) ব্যবহার করব, কারণ ব্যাচে আমি নিশ্চিত যে আপনি বলতে পারবেন না যে নাম কোনও ফাইল বা ডিরেক্টরি।

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

এমএসডিএন-তে ফাইলসিস্টেমঅবজেক্ট পরীক্ষা করুন


আমি এটি করতে পার্ল ব্যবহার করতাম। দুর্ভাগ্যক্রমে, এটি আমার উপর নির্ভর করে না।
ভেরুন

কিছু পুরানো আবেদন? দু: খজনক জিনিস।
বিরি

একজন নির্বোধ বিকাশকারী ব্যাচের ফাইলগুলি দেখেছিল এবং ভেবেছিল যে এগুলি আমাদের সমস্ত সমস্যার নিরাময়।
ভেরুন

1
@ ভেরুন উইন্ডোজ স্ক্রিপ্ট হোস্ট (ডাব্লুএসএইচ) এর পার্লের একটি সুবিধা হ'ল ডাব্লুএসএইচ উইন্ডোজের সমস্ত সংস্করণ সহ প্রাক-ইনস্টলড হয়েছে, যেখানে পার্লকে পৃথকভাবে ইনস্টল করা দরকার যা সব ক্ষেত্রেই সম্ভব্য বিকল্প হতে পারে বা নাও হতে পারে।
পরমপ্রীত ধট্ট

2

আমি ফাইলের নাম পেতে / এল বিকল্পের সাথে xcopy কমান্ডটি ব্যবহার করি। সুতরাং আপনি যদি ডিরেক্টরি বা সাব-ডিরেক্টরিতে সমস্ত ফাইল পেতে চান তবে আপনি এই জাতীয় কিছু করতে পারেন:

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

আমি কেবল গ: গন্তব্য হিসাবে ব্যবহার করি কারণ এটি সর্বদা উইন্ডোজ সিস্টেমে উপস্থিত থাকে এবং এটি অনুলিপি করে না তাই এটি কোনও বিষয় নয়। আপনি যদি সাব-ডাইরেক্টরিগুলিও চান তবে শেষে / গুলি বিকল্প ব্যবহার করুন। অন্যান্য কারণে যদি আপনার প্রয়োজন হয় তবে আপনি এক্সকপির অন্যান্য স্যুইচও ব্যবহার করতে পারেন।


2

যদি কোনও ফাইল ডিরেক্টরি হয় তা পরীক্ষা করে দেখুন:

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

এটি কেবল আপনাকেই বলে দেবে যে কোনও ফাইল ডিরেক্টরি নয় কিনা, যা যদি ফাইলের অস্তিত্ব না থাকে তবে এটিও সত্য হবে, তাই আপনার প্রয়োজন হলে প্রথমে এটি যাচাই করতে ভুলবেন না। পুনর্নির্দেশ প্রতীকগুলি এড়ানোর জন্য ক্যারেটগুলি (^) ব্যবহার করা হয় এবং ফাইল তালিকা আউটপুটটি NU এ প্রদর্শিত হতে বাধা দিতে পুনঃনির্দেশিত করা হয়, যখন ডিআইআর তালিকাভুক্তির ত্রুটির আউটপুট আউটপুটটিতে পুনর্নির্দেশ করা হয় যাতে আপনি ডিআইআর এর বার্তার বিরুদ্ধে পরীক্ষা করতে পারেন "ফাইলটি পাওয়া যায় নি File "।


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

কোডে মন্তব্য সহ এখানে আমার যাওয়া।

আমি কেবল বাইচ দক্ষতায় ব্রাশ করছি তাই যে কোনও ত্রুটিযুক্ত ত্রুটি ক্ষমা করুন।

ব্যবহারকারীর যেখানে প্রয়োজন সেখানে কিছুটা পরিবর্তন নিয়ে আমি যতটা পারি তার সমাধান হিসাবে সবগুলিতে লিখতে চেষ্টা করেছি।

কিছু গুরুত্বপূর্ণ নোট: শুধু পরিবর্তনশীল পরিবর্তন 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.