تخطي عند حدوث خطأ
-
21-09-2019 - |
سؤال
لدي الرمز التالي في الدفعة (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 لك لحذف الملفات التي تريدها. عندما يكون هناك خطأ ، فإنه ببساطة سيردد تفاصيل الملف ومتابعة معالجة الملف التالي.