لنفترض أن هناك متغيرًا يسمى %pathtofolder%
، لأنه يوضح أنه مسار كامل للمجلد.
أريد حذف كل ملف فرعي ومجلد فرعي في هذا الدليل ، ولكن ليس الدليل نفسه.
ولكن ، قد يكون هناك خطأ مثل "هذا الملف/المجلد قيد الاستخدام بالفعل" ... عندما يحدث ذلك ، يجب أن يستمر وتخطي هذا الملف/المجلد.
يمكن لأي شخص أن تعطيني بعض الأوامر لهذا؟
يمكنك استخدام هذا البرنامج النصي Shell لتنظيف المجلد والملفات داخل C:\Temp
source :
del /q "C:\Temp\*"
FOR /D %%p IN ("C:\Temp\*.*") DO rmdir "%%p" /s /q
قم بإنشاء ملف دفعي (على سبيل المثال ، delete.bat) يحتوي على الأمر أعلاه. انتقل إلى الموقع الذي يوجد به ملف delete.bat ثم قم بتشغيل الأمر: delete.bat
rmdir
هو كل ما لدي أمر القيادة المفضل لهذا المنصب. وهو يعمل لحذف الملفات والمجلدات الضخمة مع المجلدات الفرعية. لم يتم إنشاء نسخة احتياطية ، لذا تأكد من نسخ ملفاتك بأمان قبل تشغيل هذا الأمر.
RMDIR "FOLDERNAME" /S /Q
هذا بصمت يزيل المجلد وجميع الملفات والمجلدات الفرعية.
الحل الأبسط الذي يمكنني التفكير فيه هو إزالة الدليل بالكامل
RD /S /Q folderPath
ثم أنشئ هذا الدليل مرة أخرى:
MD folderPath
سيؤدي ذلك إلى إزالة المجلدات والملفات وترك المجلد خلفه.
pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)
@ECHO OFF
Set dir=path-to-dir
Echo Deleting all files from %dir%
del %dir%\* /F /Q
Echo Deleting all folders from %dir%
for /d %%p in (%dir%\*) Do rd /Q /S "%%p"
@echo Folder deleted.
exit
... يحذف جميع الملفات والمجلدات الموجودة أسفل الدليل المحدد ، ولكن لا يحذف الدليل نفسه.
CD [Your_Folder]
RMDIR /S /Q .
ستصلك رسالة خطأ ، تخبرك أن أمر RMDIR لا يمكنه الوصول إلى المجلد الحالي ، وبالتالي لا يمكنه حذفه.
تحديث :
من هذا تعليق مفيد (بفضل Moritz Both ) ، يمكنك إضافة &&
بين ، لذلك RMDIR
لن يعمل إذا فشل الأمر CD
(على سبيل المثال ، اسم الدليل غير صحيح):
CD [Your_Folder] && RMDIR /S /Q .
/S: حذف شجرة دليل (الدليل المحدد وجميع الأدلة الفرعية ، بما في ذلك جميع الملفات).
/Q: تحديد الوضع الصامت. لا يطالب بالتأكيد عند حذف شجرة دليل. (لاحظ أن/q يعمل فقط إذا تم تحديد/s.)
RD لتقف على REMOVE Directory.
/ S: حذف كافة الملفات والمجلدات الفرعية بالإضافة إلى المجلد نفسه. استخدم هذا لإزالة شجرة مجلد بأكمله.
/ س: هادئ - لا تعرض تأكيد YN
مثال:
RD /S /Q C:/folder_path/here
يمكنني استخدام بوويرشيل
Remove-Item c:\scripts\* -recurse
سيؤدي ذلك إلى إزالة محتويات المجلد ، وليس المجلد نفسه.
يمكنك القيام بذلك باستخدام الأمر التالي لحذف جميع المحتويات والمجلد الأصلي نفسه:
RMDIR [/S] [/Q] [drive:]path
استخدم المفكرة لإنشاء مستند نصي ونسخ/لصق هذا:
rmdir /s/q "%temp%"
mkdir "%temp%"
حدد حفظ باسم ، اسم الملف:
delete_temp.bat
حفظ بنوع: جميع الملفات وانقر فوق زر حفظ.
العمل على أي نوع من الحساب (مسؤول أو مستخدم قياسي) ، فقط قم بتشغيله! يمكنني استخدام متغير درجة الحرارة في هذا المثال ، ولكن يمكنك استخدام أي شيء آخر! ملاحظة لنظام التشغيل Windows فقط!
أي من الإجابات على النحو المنشور في 2018-06-01 باستثناء لسطر الأوامر الواحد المنشور بواسطةfoxidriveحذف جميع الملفات وجميع المجلدات/الدلائل في %PathToFolder%
. هذا هو السبب في نشر إجابة واحدة أخرى بسطر الأوامر البسيط للغاية لحذف جميع الملفات والمجلدات الفرعية لمجلد بالإضافة إلى ملف دفعي مع حل أكثر تعقيدًا يشرح لماذا جميع الإجابات الأخرى المنشورة في 2018-06-01 باستخدامDELوFORwithRDفشل في تنظيف مجلد بالكامل.
حل سطر الأوامر البسيط الذي يمكن استخدامه بالطبع في ملف دفعي:
pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )
يحتوي سطر الأوامر هذا على ثلاثة أوامر منفذة واحدة تلو الأخرى.
الأمر الأولPUSHDيدفع مسار الدليل الحالي على المكدس ثم يجعل %PathToFolder%
الدليل الحالي لتشغيل عملية الأمر.
يعمل هذا أيضًا مع UNC المسارات افتراضيًا بسبب تمكين الأوامر بشكل افتراضي وفي هذه الحالةPUSHDينشئ حرف محرك أقراص مؤقتًا يشير إلى مورد الشبكة المحدد ثم يتغير محرك الأقراص الحالي والدليل ، وذلك باستخدام حرف محرك الأقراص المحدد حديثا.
PUSHDإخراج بعد رسالة الخطأ لمعالجةSTDERRإذا كان الدليل المحدد غير موجود على الإطلاق:
لا يمكن للنظام العثور على المسار المحدد.
يتم منع رسالة الخطأ هذه عن طريق إعادة توجيهها باستخدام 2>nul
إلى deviceNUL.
يتم تنفيذ الأمر التاليRDفقط إذا كان تغيير الدليل الحالي لعملية الأمر الحالية إلى الدليل المحدد ناجحًا ، أي أن الدليل المحدد موجود على الإطلاق.
يقوم الأمرRDبالخيارات /Q
و /S
بإزالة الدليل بهدوء مع all الدلائل الفرعية حتى إذا كان الدليل المحدد يحتوي على ملفات أو مجلدات ذات سمة مخفية أو مع مجموعة السمات للقراءة فقط. لا تمنع سمة النظام حذف ملف أو مجلد.
لم يتم حذفها هي:
المجلدات المستخدمة كدليل حالي لأي عملية جارية. لا يمكن حذف شجرة المجلد بأكملها إلى هذا المجلد إذا تم استخدام مجلد كدليل حالي لأي عملية قيد التشغيل.
الملفات المفتوحة حاليًا بواسطة أي عملية قيد التشغيل مع تعيين أذونات الوصول إلى الملفات في الملف مفتوحة لمنع حذف الملف أثناء فتحه بواسطة التطبيق/العملية قيد التشغيل. مثل هذا الملف المفتوح يمنع أيضًا حذف شجرة المجلد بأكملها إلى الملف المفتوح.
الملفات/المجلدات التي لا يملك المستخدم الحالي فيها أذونات (NTFS) المطلوبة لحذف الملف/المجلد الذي يمنع أيضًا حذف شجرة المجلد إلى هذا الملف/المجلد.
يتم استخدام السبب الأول لعدم حذف مجلد بواسطة سطر الأوامر هذا لحذف جميع الملفات والمجلدات الفرعية للمجلد المحدد ، ولكن ليس المجلد نفسه. يتكون المجلد مؤقتًا من الدليل الحالي لتشغيل عملية الأمر والذي يمنع حذف المجلد نفسه. بالطبع ينتج عن هذا إخراج رسالة خطأ حسب الأمرRD:
لا يمكن للعملية الوصول إلى الملف لأنه قيد الاستخدام من قبل عملية أخرى.
File هو المصطلح الخطأ هنا حيث أنه في الواقع يتم استخدام المجلد بواسطة عملية أخرى ، وهي عملية الأوامر الحالية التي نفذت الأمرRD. حسنًا ، في الواقع ، يوجد مجلد خاص لنظام الملفات مع ملف سمة الدليل والذي يشرح رسالة الخطأ هذه. لكنني لا أريد التعمق في إدارة نظام الملفات.
يتم منع رسالة الخطأ هذه ، شأنها شأن جميع رسائل الخطأ الأخرى ، التي قد تحدث بسبب الأسباب الثلاثة المكتوبة أعلاه ، عن طريق إعادة توجيهها باستخدام 2>nul
من handleSTDERRto deviceNUL.
الأمر الثالثPOPDيتم تنفيذه بشكل مستقل على قيمة خروج commandRD.
POPDللملوثات العضوية الثابتة مسار الدليل الذي دفعتهPUSHDمن المكدس وتغيير الدليل الحالي لتشغيل عملية الأمر إلى هذا الدليل ، أي يستعيد الدليل الحالي الأولي.POPDيحذف حرف محرك الأقراص المؤقت الذي أنشأهPUSHDفي حالة مسار مجلد UNC.
ملاحظة: POPDيمكن أن تفشل بصمت لاستعادة الدليل الحالي الأولي في حالة الدليل الحالي الأولي كان دليل فرعي للدليل لتنظيف والتي لم تعد موجودة. في هذه الحالة الخاصة %PathToFolder%
يبقى الدليل الحالي. لذلك يُنصح بتشغيل سطر الأوامر أعلاه وليس من دليل فرعي لـ %PathToFolder%
.
واحد آخر مثير للاهتمام حقيقة:
جربت سطر الأوامر أيضًا باستخدام مسار UNC من خلال مشاركة الدليل المحلي C:\Temp
مع اسم المشاركة Temp
واستخدام مسار UNC \\%COMPUTERNAME%\Temp\CleanTest
المعين لمتغير البيئة PathToFolder
على Windows 7. إذا كان الدليل الحالي على تشغيل سطر الأوامر هو دليل فرعي عن المجلد المحلي المشترك الذي تم الوصول إليه باستخدام مسار UNC ، أي C:\Temp\CleanTest\Subfolder1
، Subfolder1
يتم حذفه بواسطةRD، وPOPDفشل بصمت في جعل C:\Temp\CleanTest\Subfolder1
مرة أخرى الدليل الحالي مما أدى إلى Z:\CleanTest
مرة أخرى كدليل حالي لعملية الأمر قيد التشغيل. لذا في هذه الحالة الخاصة جدًا ، يبقى حرف محرك الأقراص المؤقت حتى يتم تغيير الدليل الحالي على سبيل المثال ، مع cd /D %SystemRoot%
إلى دليل محلي موجود بالفعل. لسوء الحظPOPDلا يتم إنهاء بقيمة أكبر من 0 إذا فشل في استعادة الدليل الحالي الحالي مما يجعل من المستحيل اكتشاف حالة الخطأ الخاصة هذه باستخدام رمز الخروج فقط منPOPD. ومع ذلك ، يمكن الافتراض أن لا أحد يركض على الإطلاق في حالة الخطأ الخاصة هذه لأن مسارات UNC لا تستخدم عادةً للوصول إلى الملفات والمجلدات المحلية.
لفهم الأوامر المستخدمة بشكل أفضل ، افتح نافذة موجه الأوامر ، وقم بتنفيذ الأوامر التالية هناك ، وقراءة التعليمات المعروضة لكل أمر بعناية فائقة.
pushd /?
popd /?
rd /?
سطر واحد مع أوامر متعددة باستخدام ملف دفعي Windows يشرح المشغلين &&
و &
المستخدمة هنا.
بعد ذلك ، دعونا نلقي نظرة على حل ملف الدُفعات باستخدام الأمرDELلحذف الملفات في %PathToFolder%
ولـوRDلحذف المجلدات الفرعية في %PathToFolder%
.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Clean the folder for temporary files if environment variable
rem PathToFolder is not defined already outside this batch file.
if not defined PathToFolder set "PathToFolder=%TEMP%"
rem Remove all double quotes from folder path.
set "PathToFolder=%PathToFolder:"=%"
rem Consisted the folder path only of double quotes?
if not defined PathToFolder goto EndCleanFolder
rem Remove a backslash at end of folder path.
if "%PathToFolder:~-1%" == "\" set "PathToFolder=%PathToFolder:~0,-1%"
rem Consisted folder path only of a backslash (with one or more double quotes)?
if not defined PathToFolder goto EndCleanFolder
rem Delete all files in specified folder including files with hidden
rem or read-only attribute set, except the files currently opened by
rem a running process which prevents deletion of the file while being
rem opened by the application, or on which the current user has not
rem the required permissions to delete the file.
del /A /F /Q "%PathToFolder%\*" >nul 2>nul
rem Delete all subfolders in specified folder including those with hidden
rem attribute set recursive with all files and subfolders, except folders
rem being the current directory of any running process which prevents the
rem deletion of the folder and all folders above, folders containing a file
rem opened by the application which prevents deletion of the file and the
rem entire folder structure to this file, or on which the current user has
rem not the required permissions to delete a folder or file in folder tree
rem to delete.
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul
:EndCleanFolder
endlocal
يقوم الملف الدفعي أولاً بالتأكد من تعريف متغير البيئة PathToFolder
بالفعل بمسار مجلد بدون علامات اقتباس مزدوجة ودون شرطة مائلة للخلف في النهاية. لن يكون الخط المائل العكسي في النهاية مشكلة ، ولكن قد تكون علامات الاقتباس المزدوجة في مسار المجلد مشكلة بسبب أن قيمة PathToFolder
متسلسلة مع سلاسل أخرى أثناء تنفيذ ملف الدُفعات.
المهم الخطان:
del /A /F /Q "%PathToFolder%\*" >nul 2>nul
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul
يتم استخدام الأمرDELلحذف جميع الملفات في الدليل المحدد.
/A
ضروريًا لمعالجة جميع الملفات بالفعل بما في ذلك الملفات ذات السمة المخفية والتيDELستتجاهلها دون استخدام الخيار /A
./F
ضروريًا لفرض حذف الملفات باستخدام مجموعة السمات للقراءة فقط./Q
ضروري لتشغيل حذف هادئ لملفات متعددة دون مطالبة المستخدم إذا كان يجب حذف ملفات متعددة بالفعل.>nul
ضروري لإعادة توجيه إخراج أسماء الملفات المكتوبة للتعامل معSTDOUTإلى الجهازNULالتي لا يمكن حذفها بسبب فتح الملف حاليًا أو قام المستخدم لا يوجد إذن لحذف الملف.2>nul
ضروري لإعادة توجيه إخراج رسالة الخطأ لكل ملف لا يمكن حذفه من المؤشرSTDERRإلى الجهازNUL.يتم استخدام الأوامرلـوRDلإزالة جميع الدلائل الفرعية في الدليل المحدد. لكن for /D
لا يُستخدم بسببلـيتجاهل الدلائل الفرعية مع مجموعة السمات المخفية. لهذا السبب ، يتم استخدام for /F
لتشغيل سطر الأوامر التالي في عملية أوامر منفصلة بدأت في الخلفية بـ cmd.exe /C
:
dir "%PathToFolder%\*" /AD /B 2>nul
DIRإخراج بتنسيق عارية بسبب /B
إدخالات الدليل مع السمة D
، أي أسماء جميع الدلائل الفرعية في الدليل المحدد مستقلة عن السمات الأخرى مثل السمة المخفية بدون مسار. يتم استخدام 2>nul
لإعادة توجيه إخراج رسالة الخطأ بواسطةDIRعلى أي دليل موجود من المؤشرSTDERRإلى الجهازNUL.
يجب تخطي عامل إعادة التوجيه >
بحرف علامة الإقحام ^
onلـسطر الأوامر ليتم تفسيره كحرف حرفي عندما يقوم مترجم أوامر Windows بمعالجة سطر الأوامر هذا قبل تنفيذ الأمرلـالذي ينفذ سطر الأوامر dir
المدمج في عملية قيادة منفصلة بدأت في الخلفية.
FORيعالج الناتج الذي تم التقاطه مكتوبًا للتعامل معSTDOUTلعملية تشغيل الأوامر والتي هي أسماء الدلائل الفرعية بدون مسار ولا يتم تضمينها في علامات اقتباس مزدوجة.
لـمع الخيار /F
يتجاهل الأسطر الفارغة التي لا تحدث هنا لأنDIRمع الخيار /B
لا يخرج الأسطر الفارغة.
FORقد يتجاهل أيضًا الأسطر التي تبدأ بفاصلة منقوطة وهي نهاية حرف السطر الافتراضية. يمكن أن يبدأ اسم الدليل بفاصلة منقوطة. لهذا السبب ، يتم استخدام eol=|
لتعريف حرف الشريط العمودي على أنه نهاية السطر الذي لا يمكن أن يوجد به دليل أو ملف باسمه.
FORسوف يقسم الخط إلى سلاسل فرعية باستخدام مساحة وعلامة تبويب أفقية كمحددات وسوف يعين فقط السلسلة المحددة بمسافة/علامة تبويب أولية لمتغير حلقة محدد I
. هذا السلوك الانقسام غير مطلوب هنا بسبب اسم الدليل يمكن أن يحتوي على مسافة أو أكثر. لذلك يتم استخدام delims=
لتحديد قائمة فارغة من المحددات لتعطيل سلوك تقسيم الخط والحصول على تعيين حلقة متغير I
دائمًا اسم الدليل الكامل.
CommandFORيعمل commandRDلكل اسم دليل بدون مسار وهذا هو السبب فيRDسطر الأوامر يجب أن يكون مسار المجلد المحدد مرة أخرى وهو متسلسل مع اسم المجلد الفرعي.
لفهم الأوامر المستخدمة وكيفية عملها ، افتح نافذة موجه الأوامر ، وقم بتنفيذ الأوامر التالية هناك ، واقرأ بالكامل صفحات المساعدة المعروضة لكل أمر بعناية فائقة.
del /?
dir /?
echo /?
endlocal /?
for /?
goto /?
if /?
rd /?
rem /?
set /?
setlocal /?
لحذف الملف:
del PATH_TO_FILE
لحذف مجلد به جميع الملفات فيه:
rmdir /s /q PATH_TO_FOLDER
يعد حذف جميع الملفات من مجلد معين (وليس حذف المجلد نفسه) أمرًا معقدًا بعض الشيء. لا يمكن لـ del /s *.*
حذف المجلدات ، ولكنه يزيل الملفات من كل مجلد فرعي. لذلك هناك حاجة إلى أمرين:
del /q PATH_TO_FOLDER\*.*
for /d %i in (PATH_TO_FOLDER\*.*) do @rmdir /s /q "%i"
جربت العديد من هذه الأساليب ، لكن لم ينجح أي منها.
لقد وجدت هذا النهج المكون من خطوتين في الموقع سطر أوامر Windows :
forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==FALSE del @file"
forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==TRUE rmdir /S /Q @file"
كان يعمل بالضبط كما كنت بحاجة وكما هو محدد من قبل OP.
@ECHO OFF
rem next line removes all files in temp folder
DEL /A /F /Q /S "%temp%\*.*"
rem next line cleans up the folder's content
FOR /D %%p IN ("%temp%\*.*") DO RD "%%p" /S /Q