it-swarm.asia

كيفية حذف الملفات/المجلدات الفرعية في دليل معين في القيادة موجه في ويندوز

لنفترض أن هناك متغيرًا يسمى %pathtofolder% ، لأنه يوضح أنه مسار كامل للمجلد.

أريد حذف كل ملف فرعي ومجلد فرعي في هذا الدليل ، ولكن ليس الدليل نفسه.

ولكن ، قد يكون هناك خطأ مثل "هذا الملف/المجلد قيد الاستخدام بالفعل" ... عندما يحدث ذلك ، يجب أن يستمر وتخطي هذا الملف/المجلد.

يمكن لأي شخص أن تعطيني بعض الأوامر لهذا؟

270
Deniz Zoeteman

يمكنك استخدام هذا البرنامج النصي Shell لتنظيف المجلد والملفات داخل C:\Tempsource :

del /q "C:\Temp\*"
FOR /D %%p IN ("C:\Temp\*.*") DO rmdir "%%p" /s /q

قم بإنشاء ملف دفعي (على سبيل المثال ، delete.bat) يحتوي على الأمر أعلاه. انتقل إلى الموقع الذي يوجد به ملف delete.bat ثم قم بتشغيل الأمر: delete.bat

228
Iain

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

RMDIR "FOLDERNAME" /S /Q

هذا بصمت يزيل المجلد وجميع الملفات والمجلدات الفرعية.

311
Suresh

الحل الأبسط الذي يمكنني التفكير فيه هو إزالة الدليل بالكامل

RD /S /Q folderPath

ثم أنشئ هذا الدليل مرة أخرى:

MD folderPath
81
wojciech_rak

سيؤدي ذلك إلى إزالة المجلدات والملفات وترك المجلد خلفه.

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)
49
foxidrive
@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

... يحذف جميع الملفات والمجلدات الموجودة أسفل الدليل المحدد ، ولكن لا يحذف الدليل نفسه.

35
thepip3r
CD [Your_Folder]
RMDIR /S /Q .

ستصلك رسالة خطأ ، تخبرك أن أمر RMDIR لا يمكنه الوصول إلى المجلد الحالي ، وبالتالي لا يمكنه حذفه.

تحديث :

من هذا تعليق مفيد (بفضل Moritz Both ) ، يمكنك إضافة && بين ، لذلك RMDIR لن يعمل إذا فشل الأمر CD (على سبيل المثال ، اسم الدليل غير صحيح):

CD [Your_Folder] && RMDIR /S /Q .

من مرجع سطر أوامر Windows :

/S: حذف شجرة دليل (الدليل المحدد وجميع الأدلة الفرعية ، بما في ذلك جميع الملفات).

/Q: تحديد الوضع الصامت. لا يطالب بالتأكيد عند حذف شجرة دليل. (لاحظ أن/q يعمل فقط إذا تم تحديد/s.)

24
O.Badr

RD لتقف على REMOVE Directory.

/ S: حذف كافة الملفات والمجلدات الفرعية بالإضافة إلى المجلد نفسه. استخدم هذا لإزالة شجرة مجلد بأكمله.

/ س: هادئ - لا تعرض تأكيد YN

مثال:

RD /S /Q C:/folder_path/here
9
Sireesh Yarlagadda

يمكنني استخدام بوويرشيل

Remove-Item c:\scripts\* -recurse

سيؤدي ذلك إلى إزالة محتويات المجلد ، وليس المجلد نفسه.

7
rhellem

يمكنك القيام بذلك باستخدام الأمر التالي لحذف جميع المحتويات والمجلد الأصلي نفسه:

RMDIR [/S] [/Q] [drive:]path            
4
Ripon Al Wasim

استخدم المفكرة لإنشاء مستند نصي ونسخ/لصق هذا:

rmdir /s/q "%temp%"
mkdir "%temp%"

حدد حفظ باسم ، اسم الملف:

delete_temp.bat

حفظ بنوع: جميع الملفات وانقر فوق زر حفظ.

العمل على أي نوع من الحساب (مسؤول أو مستخدم قياسي) ، فقط قم بتشغيله! يمكنني استخدام متغير درجة الحرارة في هذا المثال ، ولكن يمكنك استخدام أي شيء آخر! ملاحظة لنظام التشغيل Windows فقط!

4
Filip Gjorgjevikj

أي من الإجابات على النحو المنشور في 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 الدلائل الفرعية حتى إذا كان الدليل المحدد يحتوي على ملفات أو مجلدات ذات سمة مخفية أو مع مجموعة السمات للقراءة فقط. لا تمنع سمة النظام حذف ملف أو مجلد.

لم يتم حذفها هي:

  1. المجلدات المستخدمة كدليل حالي لأي عملية جارية. لا يمكن حذف شجرة المجلد بأكملها إلى هذا المجلد إذا تم استخدام مجلد كدليل حالي لأي عملية قيد التشغيل.

  2. الملفات المفتوحة حاليًا بواسطة أي عملية قيد التشغيل مع تعيين أذونات الوصول إلى الملفات في الملف مفتوحة لمنع حذف الملف أثناء فتحه بواسطة التطبيق/العملية قيد التشغيل. مثل هذا الملف المفتوح يمنع أيضًا حذف شجرة المجلد بأكملها إلى الملف المفتوح.

  3. الملفات/المجلدات التي لا يملك المستخدم الحالي فيها أذونات (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 /?
3
Mofi

لحذف الملف:

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"
3
Maxim Suslov

جربت العديد من هذه الأساليب ، لكن لم ينجح أي منها.
لقد وجدت هذا النهج المكون من خطوتين في الموقع سطر أوامر 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.

0
Paul Haan
@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
0
Robie