قم بتكرار كافة الملفات الموجودة في الدليل باستخدام حلقة "for".

StackOverflow https://stackoverflow.com/questions/138497

سؤال

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

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

هل كانت مفيدة؟

المحلول

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

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

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

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

(شكرًا @agnul)

نصائح أخرى

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

  • ...الملفات الموجودة في الدليل الحالي: 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

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

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

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

ألقِ نظرة هنا أيضًا: http://technet.microsoft.com/en-us/library/bb490890.aspx

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

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

FOR %i IN (*) DO ECHO %i

من ملف دفعي:

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

للتكرار على كل ملف، ستعمل حلقة 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!"
)

*الحدود:سيحصل val<=%%f على السطر الأول فقط من الملف.

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

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

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

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

بعض الأشياء التي يجب معرفتها حول حجة dir/a.

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

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

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

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

جرب هذا:

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

جرب "مساعدة" في cmd للحصول على دليل كامل

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

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

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

ويمكنه أيضًا استخدام ملفات تعريفية يأمر:

forfiles /s 

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

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

سأستخدم 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

يفحص FileSystemObject على MSDN.

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

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

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

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

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 "لم يتم العثور على الملف" ".

جرب هذا:

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

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

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

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

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

واجهت مشكلة في الحصول على إجابة جوب للعمل بمسار مطلق حتى وجدت هذا المرجع: https://ss64.com/nt/for_r.html

يتكرر المثال التالي خلال كافة الملفات الموجودة في الدليل المعطى بواسطة المسار المطلق.

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top