أحاول الحصول على commit-build.bat
الخاص بي لتنفيذ ملفات .BAT الأخرى كجزء من عملية الإنشاء الخاصة بنا.
محتوى commit-build.bat
:
"msbuild.bat"
"unit-tests.bat"
"deploy.bat"
هذا يبدو بسيطًا بما يكفي ، لكن commit-build.bat
ينفذ العنصر الأول فقط في القائمة (msbuild.bat
).
لقد قمت بتشغيل كل ملف على حدة دون أي مشاكل.
استعمال:
call msbuild.bat
call unit-tests.bat
call deploy.bat
عند عدم استخدام CALL ، يتوقف ملف الدُفعات الحالي ويبدأ تنفيذ ملف الدُفعات المُسمى. إنه سلوك غريب يرجع تاريخه إلى أيام MS-DOS المبكرة.
جميع الإجابات الأخرى صحيحة: استخدم المكالمة. فمثلا:
call "msbuild.bat"
التاريخ
في إصدارات DOS القديمة ، لم يكن من الممكن تنفيذ الملفات الدفعية بشكل متكرر. بعد ذلك ، تم تقديم الأمر call الذي استدعى Shell cmd آخر لتنفيذ ملف الدُفعات وعاد التنفيذ مرة أخرى إلى Shell cmd المتصل عند الانتهاء.
من الواضح في الإصدارات اللاحقة لم يعد أمر cmd Shell ضروريًا بعد الآن.
في الأيام الأولى ، كانت العديد من ملفات الدُفعات تعتمد على حقيقة أن استدعاء ملف الدُفعات لن يعود إلى ملف الدُفعات المتصل. قد يؤدي تغيير هذا السلوك دون بناء جملة إضافي إلى كسر العديد من الأنظمة مثل أنظمة قوائم الدُفعات (باستخدام ملفات الدُفعات لهياكل القائمة).
كما هو الحال في العديد من الحالات مع Microsoft ، فإن التوافق مع الإصدارات السابقة هو سبب هذا السلوك.
نصائح
إذا كانت ملفات الدُفعات الخاصة بك بها مسافات في أسمائها ، فاستخدم علامات الاقتباس حول الاسم:
call "unit tests.bat"
بالمناسبة: إذا لم يكن لديك كل أسماء ملفات الدُفعات ، فيمكنك أيضًا استخدامها للقيام بذلك (لا يضمن الترتيب الصحيح لمكالمات ملفات الدُفعات ؛ يتبع ترتيب نظام الملفات):
FOR %x IN (*.bat) DO call "%x"
يمكنك أيضًا الرد على مستويات الخطأ بعد المكالمة. استعمال:
exit /B 1 # Or any other integer value in 0..255
لرد الجميل errorlevel. 0 يدل على التنفيذ الصحيح. في ملف الدُفعات المتصل يمكنك الرد باستخدام
if errorlevel neq 0 <batch command>
استخدم if errorlevel 1
إذا كان لديك Windows أقدم من NT4/2000/XP لالتقاط جميع مستويات الأخطاء 1 وأكبر.
للتحكم في تدفق ملف دفعي ، هناك غوتو :-(
if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...
كما أشار آخرون: ألق نظرة على أنظمة الإنشاء لاستبدال الملفات الدفعية.
إذا كنا نريد فتح مطالبات الأوامر متعددة ثم يمكننا استخدام
start cmd /k
/k
: إلزامي والذي سيتم تنفيذه.
يمكن إطلاق العديد من أوامر الأوامر على النحو التالي.
start cmd /k Call rc_hub.bat 4444
start cmd /k Call rc_grid1.bat 5555
start cmd /k Call rc_grid1.bat 6666
start cmd /k Call rc_grid1.bat 5570.
محاولة:
call msbuild.bat
call unit-tests.bat
call deploy.bat
أنت تتصل بدُفعات متعددة في محاولة لتجميع برنامج. أعتبر أمرا مفروغا منه أنه إذا حدث خطأ:
1) سيتم إنهاء البرنامج ضمن الدُفعة باستخدام errorlevel؛
2) أنت تريد أن تعرف عن ذلك.
for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1
'||' يختبر مستوى خطأ أعلى من 0. وبهذه الطريقة يتم استدعاء جميع الدُفعات بالترتيب ولكن ستتوقف عند أي خطأ ، تاركة الشاشة كما هي بالنسبة لك لرؤية أي رسالة خطأ.
call msbuild.bat
call unit-tests.bat
call deploy.bat
للاتصال بملف .bat
ضمن ملف .bat
، استخدم
call foo.bat
(نعم ، هذا سخيف ، سيكون من المنطقي أكثر إذا كنت تستطيع الاتصال به بـ foo.bat
، كما يمكنك من موجه الأوامر ، ولكن الطريقة الصحيحة هي استخدام call
.)
إذا كان لدينا اثنين من البرامج النصية الدفعية ، aaa.bat و bbb.bat ، واتصل مثل أدناه
call aaa.bat
call bbb.bat
عند تنفيذ البرنامج النصي ، سوف يقوم بالاتصال بـ aaa.bat أولاً ، انتظر انتهاء مؤشر ترابط aaa.bat ، واتصل بـ bbb.bat.
ولكن إذا كنت لا ترغب في الانتظار حتى ينتهي aaa.bat للاتصال بـ bbb.bat ، فحاول استخدام الأمر START :
START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program]
[parameters]
امتحان:
start /b aaa.bat
start /b bbb.bat
بالنظر إلى أسماء ملفاتك ، هل فكرت في استخدام أداة إنشاء مثل NAnt أو Ant (إصدار Java). ستحصل على تحكم أكثر بكثير من ملفات الخفافيش.
Start msbuild.bat
Start unit-tests.bat
Start deploy.bat
إذا لم ينجح ذلك ، استبدل start
بـ call
أو جرّب هذا:
Start msbuild.bat
Goto :1
:1
Start unit-tests.bat
Goto :2
:2
Start deploy.bat
إذا كنت ترغب في فتح العديد من الملفات الدفعية مرة واحدة ، يمكنك استخدام الأمر call. ومع ذلك ، يقوم أمر call بإغلاق ملف الخفافيش الحالي وينتقل إلى ملف آخر. إذا كنت ترغب في فتح الكثير في وقت واحد ، فقد ترغب في محاولة ذلك:
@echo off
start cmd "call ex1.bat&ex2.bat&ex3.bat"
وهلم جرا أو كرر بدء cmd
"call
..." مهما كان عدد الملفات. يعمل هذا مع Windows 7 ، لكنني لست متأكدًا من الأنظمة الأخرى.
تشغيل البرامج النصية متعددة في واحد كان لي نفس المشكلة. ظللت أموت على أول واحد لا أدرك أنه كان يخرج من البرنامج النصي الأول.
:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT
:: ScriptA.bat
Do Foo
EXIT
::ScriptB.bat
Do bar
EXIT
لقد أزلت جميع خطوطي البالغ عددها 11 خطوط EXIT وحاولت مرة أخرى ، ركضت جميعها 11 مرة واحدة في كل مرة في نفس نافذة الأوامر.
:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT
::ScriptA.bat
Do Foo
::ScriptB.bat
Do bar
فقط استخدم الأمر call
! هنا مثال:
call msbuild.bat
call unit-tests.bat
call deploy.bat
مع اقتباس صحيح (قد يكون هذا صعبًا في بعض الأحيان):
start "" /D "C:\Program Files\ProgramToLaunch" "cmd.exe" "/c call ""C:\Program Files\ProgramToLaunch\programname.bat"""
الوسيط الأول - العنوان (فارغ في هذه الحالة)
الوسيطة الثانية -/D تحدد دليل البدء ، يمكن إزالتها إذا كنت تريد دير العمل الحالي (مثل "٪ ~ dp0")
3 arg - الأمر لإطلاق "cmd.exe"
الوسيطة الرابعة - وسيطات للأمر ، مع مضاعفة علامتي الاقتباس للوسائط الموجودة بداخلها (هذه هي الطريقة التي يمكنك بها الهروب من علامات الاقتباس داخل علامات الاقتباس دفعة واحدة)