it-swarm.asia

تكرار كل الملفات في الدليل باستخدام حلقة 'for'

كيف يمكنني التكرار على كل ملف في دليل باستخدام حلقة for؟

وكيف يمكنني معرفة ما إذا كان إدخال معين هو دليل أم أنه مجرد ملف؟

301
Vhaerun

هذا يسرد جميع الملفات (والملفات فقط) في الدليل الحالي:

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

أيضًا إذا قمت بتشغيل هذا الأمر في ملف دفعي ، فستحتاج إلى مضاعفة علامات٪.

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

(شكراagnul)

428
jop

التكرار من خلال ...

  • ... الملفات في dir الحالي: for %f in (.\*) do @echo %f
  • ... subdirs in dir الحالي: for /D %s in (.\*) do @echo %s
  • ... الملفات الموجودة حاليًا وجميع الأقسام الفرعية: for /R %f in (.\*) do @echo %f
  • ... subdirs في الحالي وجميع subdirs: for /R /D %s in (.\*) do @echo %s

لسوء الحظ ، لم أجد أي طريقة للتكرار عبر الملفات والإشارات الفرعية في نفس الوقت.

مجرد استخدام cygwin مع باش لمزيد من الوظائف.

بصرف النظر عن هذا: هل لاحظت أن تعليمات buildin لـ MS Windows هي مورد رائع لوصف بناء جملة سطر أوامر cmd؟

انظر أيضًا هنا: http://technet.Microsoft.com/en-us/library/bb490890.aspx

198
Marco

هناك اختلاف دقيق بين تشغيل FOR من سطر الأوامر ومن ملف دفعي. في ملف دفعي ، تحتاج إلى وضع حرفين % أمام كل مرجع متغير.

من سطر الأوامر:

FOR %i IN (*) DO ECHO %i

من ملف دفعي:

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

للتكرار على كل ملف ، ستعمل حلقة for:

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

في حالتي أردت أيضًا محتوى الملف ، الاسم ، إلخ.

هذا يؤدي إلى عدد قليل من المشاكل وأعتقد أن حالتي الاستخدام قد تساعد. فيما يلي حلقة تقرأ المعلومات من كل ملف ".txt" في دليل وتتيح لك القيام بشيء ما (setx على سبيل المثال).

@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 سيحصل فقط على السطر الأول من الملف.

47
Aaron Votre

سيقوم هذا for-loop بسرد جميع الملفات في الدليل.

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

"delims =" مفيد لإظهار أسماء الملفات الطويلة مع مسافات فيه ....

'/ b "عرض الأسماء فقط ، وليس تواريخ الحجم وما إلى ذلك.

بعض الأشياء التي يجب معرفتها عن حجة دير /.

  • أي استخدام لـ "/" سوف يسرد كل شيء ، بما في ذلك السمات المخفية وخصائص النظام.
  • "/ ad" سيعرض فقط الدلائل الفرعية ، بما في ذلك الدلائل المخفية والنظام.
  • تعمل الوسيطة "/ a-d" على إزالة المحتوى ذي السمة 'D'irectory.
  • "/ a-d-h-s" ستظهر كل شيء ، لكن الإدخالات ذات السمة 'D'irectory ،' H'idden 'S'ystem.

إذا كنت تستخدم هذا في سطر الأوامر ، فقم بإزالة "٪".

أتمنى أن يساعدك هذا.

40
Jay

في باش ، قد تفعل شيئا مثل هذا:

for fn in *; do
    if [ -d $fn ]; then
        echo "$fn is a directory"
    fi
    if [ -f $fn ]; then
        echo "$fn is a file"
    fi
done

لقد لاحظت أنك سألت عن دُفعة ، والتي أخطأت في قراءتها باش . قد لا تكون هذه الإجابة مناسبة لسؤالك.

11
Greg Hewgill

يشير٪ 1 إلى الوسيطة الأولى التي تم تمريرها ولا يمكن استخدامها في أداة التكرار.

جرب هذا:

@echo off
for %%i in (*.*) do echo %%i
10
Sam Meldrum
for %1 in (*.*) do echo %1

جرب "HELP FOR" في كمد للحصول على دليل كامل

هذا هو دليل أوامر XP. http://www.ss64.com/nt/

5
Axeman

يمكنه أيضًا استخدام الأمر forfiles الأمر:

forfiles /s 

وأيضا تحقق مما إذا كان هو دليل

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

تنشئ التعليمة البرمجية التالية ملفًا باسم "AllFilesInCurrentDirectorylist.txt" في الدليل الحالي ، والذي يحتوي على قائمة بجميع الملفات (الملفات فقط) في الدليل الحالي. تحقق من ذلك

dir /b /a-d > AllFilesInCurrentDirectorylist.txt
3
Ankur

أود استخدام vbscript (Windows Scripting Host) ، لأنني على يقين من أنك لا تستطيع معرفة أن الاسم هو ملف أو دليل.

في 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

تحقق FileSystemObject على MSDN .

2
Biri

يمكنني استخدام الأمر xcopy مع خيار/L للحصول على أسماء الملفات. لذلك إذا كنت ترغب في الحصول على دليل أو جميع الملفات الموجودة في الدليل الفرعي ، فيمكنك فعل شيء مثل هذا:

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

أنا فقط استخدم c:\كوجهة لأنه موجود دائمًا على أنظمة windows ولا يتم نسخه ، لذلك لا يهم. إذا كنت تريد الدلائل الفرعية فقط استخدم الخيار/s في النهاية. يمكنك أيضًا استخدام رموز التبديل الأخرى في xcopy إذا كنت في حاجة إليها لأسباب أخرى.

2
Knoots

جرب هذا:

::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 ..) إذا كنت بحاجة إلى تصفية ملفات أخرى في الحلقة

2
Littlepony

جرب هذا لاختبار ما إذا كان الملف عبارة عن دليل:

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
sugerfunk

في حالتي ، اضطررت إلى حذف جميع الملفات والمجلدات الموجودة أسفل مجلد مؤقت. لذلك هكذا انتهى بي الأمر. اضطررت إلى تشغيل حلقتين واحدة للملف والآخر للمجلدات. إذا كانت الملفات أو المجلدات بها مسافات في أسمائها ، فعليك استخدام ""

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
Sam B

إلى التكرار من خلال جميع الملفات والمجلدات يمكنك استخدامها

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
1
jafarbtech