it-swarm.asia

كيفية تشغيل ملفات .BAT متعددة داخل ملف .BAT

أحاول الحصول على commit-build.bat الخاص بي لتنفيذ ملفات .BAT الأخرى كجزء من عملية الإنشاء الخاصة بنا.

محتوى commit-build.bat:

"msbuild.bat"
"unit-tests.bat"
"deploy.bat"

هذا يبدو بسيطًا بما يكفي ، لكن commit-build.bat ينفذ العنصر الأول فقط في القائمة (msbuild.bat).

لقد قمت بتشغيل كل ملف على حدة دون أي مشاكل.

621
Th3Fix3r

استعمال:

call msbuild.bat
call unit-tests.bat
call deploy.bat

عند عدم استخدام CALL ، يتوقف ملف الدُفعات الحالي ويبدأ تنفيذ ملف الدُفعات المُسمى. إنه سلوك غريب يرجع تاريخه إلى أيام MS-DOS المبكرة.

1056
Philippe Leybaert

جميع الإجابات الأخرى صحيحة: استخدم المكالمة. فمثلا:

 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
...

كما أشار آخرون: ألق نظرة على أنظمة الإنشاء لاستبدال الملفات الدفعية.

163
Ralph M. Rickenbach

إذا كنا نريد فتح مطالبات الأوامر متعددة ثم يمكننا استخدام

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.
101
farheen

محاولة:

call msbuild.bat
call unit-tests.bat
call deploy.bat
40
Jonathan

أنت تتصل بدُفعات متعددة في محاولة لتجميع برنامج. أعتبر أمرا مفروغا منه أنه إذا حدث خطأ:
1) سيتم إنهاء البرنامج ضمن الدُفعة باستخدام errorlevel؛
2) أنت تريد أن تعرف عن ذلك.

for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1

'||' يختبر مستوى خطأ أعلى من 0. وبهذه الطريقة يتم استدعاء جميع الدُفعات بالترتيب ولكن ستتوقف عند أي خطأ ، تاركة الشاشة كما هي بالنسبة لك لرؤية أي رسالة خطأ.

26
Jay
call msbuild.bat
call unit-tests.bat
call deploy.bat
21
butterchicken

للاتصال بملف .bat ضمن ملف .bat ، استخدم

call foo.bat

(نعم ، هذا سخيف ، سيكون من المنطقي أكثر إذا كنت تستطيع الاتصال به بـ foo.bat ، كما يمكنك من موجه الأوامر ، ولكن الطريقة الصحيحة هي استخدام call.)

19
Zifre

إذا كان لدينا اثنين من البرامج النصية الدفعية ، 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
17
user2314621

بالنظر إلى أسماء ملفاتك ، هل فكرت في استخدام أداة إنشاء مثل NAnt أو Ant (إصدار Java). ستحصل على تحكم أكثر بكثير من ملفات الخفافيش.

7
Dave Archer
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
5
McOussKing

إذا كنت ترغب في فتح العديد من الملفات الدفعية مرة واحدة ، يمكنك استخدام الأمر call. ومع ذلك ، يقوم أمر call بإغلاق ملف الخفافيش الحالي وينتقل إلى ملف آخر. إذا كنت ترغب في فتح الكثير في وقت واحد ، فقد ترغب في محاولة ذلك:

@echo off
start cmd "call ex1.bat&ex2.bat&ex3.bat"

وهلم جرا أو كرر بدء cmd "call..." مهما كان عدد الملفات. يعمل هذا مع Windows 7 ، لكنني لست متأكدًا من الأنظمة الأخرى.

4
CMS_95

تشغيل البرامج النصية متعددة في واحد كان لي نفس المشكلة. ظللت أموت على أول واحد لا أدرك أنه كان يخرج من البرنامج النصي الأول.

:: 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
2
John Oliphant

فقط استخدم الأمر call! هنا مثال:

call msbuild.bat
call unit-tests.bat
call deploy.bat
1
PryroTech

مع اقتباس صحيح (قد يكون هذا صعبًا في بعض الأحيان):

start "" /D "C:\Program Files\ProgramToLaunch" "cmd.exe" "/c call ""C:\Program Files\ProgramToLaunch\programname.bat"""

الوسيط الأول - العنوان (فارغ في هذه الحالة)
الوسيطة الثانية -/D تحدد دليل البدء ، يمكن إزالتها إذا كنت تريد دير العمل الحالي (مثل "٪ ~ dp0")
3 arg - الأمر لإطلاق "cmd.exe"
الوسيطة الرابعة - وسيطات للأمر ، مع مضاعفة علامتي الاقتباس للوسائط الموجودة بداخلها (هذه هي الطريقة التي يمكنك بها الهروب من علامات الاقتباس داخل علامات الاقتباس دفعة واحدة)

1
robertcollier4