سؤال

لدي الرمز التالي في الدفعة (CMD):

for /f "delims=" %%f in ('dir /b /s Example') do (
command
if %errorlevel%==1 (
command
SKIP
)
command
)

تعديل:لجعل الأمور أكثر وضوحًا:for /f... يبحث عن دليل يسمى "مثال" والحلقات للبحث عن أدلة أكثر من واحد. الأول command هو أمر حذف ، فهو يحذف جميع الملفات في الدليل. ال command يحدث ذلك عندما يحدث خطأ ، هو أ echo الأمر الذي يكتب بعض المعلومات حول الخطأ إلى ملف نصي. الآن الثقب skip شيء؛ في بعض الأحيان ، لا يمكن حذف الملفات بسبب access denied أو this file is in use by.... عادة ، ماذا سيحدث إذا لم يكن هناك شيء تخطي ، فإنه سيوقف الأمر وتعليقه. لذا ، ما أريد القيام به ، هو منع حدوث ذلك. بدلاً من ذلك ، أريد استخدام شيء مثل skip, ، بحيث يمكنه تخطي الملف والمتابعة على أي حال. لذلك أعتقد أن هذا الأمر يحتاج إلى أن يكون في أنابيب في delete أمر.

أتمنى أن يكون الأمر واضحًا الآن.

شكرا لك مقدما.

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

المحلول

مثله؟

for /f "delims=" %%f in ('dir /b /s Example') do (
  command
  if not errorlevel 1 (
    command-for-success
  ) else (
    command-for-error
  )
)

نصائح أخرى

قم بإنشاء ملفين الأوامر وقم بتشغيل delex.cmd. سيتم تسجيل الملفات والأدلة التي لم يتم حذفها إلى delex.txt. تلك التي يتم تعليقها ، سيكون لها نافذة CMD مفتوحة تقلل من القتل بعد تأخير باستخدام Ping (بفضل اقتراح Doc Brown).

delex2.cmd
----------
@echo off
del /q %1 
if exist %1 echo %1 not deleted!>>delex.txt 
exit 

delex.cmd
---------
@echo off
if exist delex.txt del delex.txt 
for /f "delims=" %%f in ('dir /s /b example') do start "delextaskkill" /min delex2.cmd "%%f"
ping 127.0.0.1 -n 3 -w 1000> nul
taskkill /fi "Windowtitle eq delextaskkill"> nul

تم اختباره مع:

\example
|   file1
|   file2
|   file3
|   file4
|   file5
|
\---example
        file1
        file2
        file3
        file4
        file5

عندما يستخدم المرء del, و "Access Refered" أو "هذا الملف قيد الاستخدام بواسطة ..." يحدث ، %errorlevel% هو 0 ، لذلك الاختبار %errolevel% عديمة الفائدة. ربما يعمل الحل البسيط التالي في حالتك:

for /f "delims=" %%f in ('dir /b /s Example') do (
    del %%f
    if exist %%f (
         echo "file not deleted"
    ) else (
         echo "file deleted"
    )
 ) 

أعتقد أن هذا ما تريده

for /f "delims=" %%f in ('dir /b /s Example') do (
  command
  if not errorlevel 1 (
    command
  ) else (
    command
    goto :eof
  )
)

ربما يكون هذا أكثر تقدماً مما يمكن إنجازه باستخدام معالجة CMD مدمجة فقط. لماذا لا تفكر في استخدام مضيف البرمجة النصية Windows (VBScript/JScript) أو حتى PowerShell؟ من المحتمل أن يوفر لك كلاهما مستوى التحكم الذي تطلبه.

جرب ملف الدُفعة هذا:

@echo off
REM For each directory named 'Example' ...
for /f "delims=" %%f in ('dir /b /s Example') do (
    REM .. enter the directory and delete all the files found there.
    pushd .
    cd %%f
    del /q *
    for /f "delims=" %%z in ('dir /b') do (
        REM Any files that still exist must have been inaccessable.  Log an error.
        echo Unable to delete file %%z > C:\logfile.txt
    )
    popd
)

تم اختباره مع بنية الدليل التالية:

folder\
|------Example\
|      |-------file1 (write-protected)
|      |-------file2
|      |-------file3
|------deeper\
       |-------Example\
               |-------file4
               |-------file5 (write-protected)
               |-------file6

بعد تشغيل ملف الدُفعة ، فقط file1 و file5 تركت. تمت طباعة رسالة "الوصول إلى" لكل ملف محمي الكتابة ؛ إذا كان ذلك مزعجًا ، فأنت تعيد توجيه إخراج ملف الدُفعات مثل script.bat > NUL لإخفائه.

لذلك بعد كل الإجابات الحالية ، لم ترضيك وتحتاج تمامًا إلى تخطي ملف الدُفعات الخاص بك ، سأجرب آخر:

@echo off
setlocal

for /f "delims=" %%f in ('dir /b /s batch') do call :DoSomething %%f
goto end

:DoSomething
echo Here i am: %1
if %errorlevel%==1 goto :eof

echo No error occured
goto :eof

:end
endlocal

الحيلة هي أن الحلقة تتصل بوظيفة فرعية داخل نفس الملف وتعطي المعلمة المطلوبة لها. تعمل هذه المكالمة الجديدة في سياق جديد ويمكنه الوصول فقط إلى المتغيرات التي يتم تعريفها بعد do call :DoSomething بالترتيب المعطى.

لذلك عليك الوصول إلى المتغيرات هنا %1, %2, ، إلخ. إذا كنت تريد ترك هذا السياق ، فعليك عمل ملف goto :eof للقفز إلى نهاية الملف (يتم تعريف هذه العلامة مسبقًا في وضع الدُفعات ويجب ألا يحدث داخل ملفك) ، ما يترك السياق ويعود إلى الحلقة.

بعد الركض عبر الحلقة بأكملها ، نقفز فقط إلى :end علامة ، اجعل القليل من التنظيف وانتهت.

ما يلي يبحث عن مدى الملفات التي تريدها بشكل متكرر تحت شجرة دليل "dirname" وتنفيذ commandstuff.bat مقابل اسم الملف:

لـ /r ٪ i in (c: dirname *. ext) do commandstuff "٪ i"

commandstuff.bat يشبه هذا:

@صدى خارج
ديل ٪ 1
إذا (٪ errorlevel ٪ == 0) Goto End
:خطأ
خطأ صدى حذف ٪ 1

:نهاية
صدى نهاية

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top