একটি .BAT ফাইলের মধ্যে কীভাবে একাধিক .BAT ফাইল চালানো যায়


695

আমি commit-build.batআমাদের বিল্ড প্রসেসের অংশ হিসাবে অন্য .BAT ফাইলগুলি কার্যকর করতে আমার চেষ্টা করছি ।

এর বিষয়বস্তু commit-build.bat:

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

এটি যথেষ্ট সহজ বলে মনে হচ্ছে তবে commit-build.batতালিকার প্রথম আইটেমটি কার্যকর করে ( msbuild.bat)।

আমি কোনও ফাইল ছাড়াই প্রতিটি ফাইল পৃথকভাবে চালিত করেছি।


4
@ সিয়ান - কমান্ড লাইন ব্যবহারের জন্য আপনাকে পুরো সাইগউইন প্যাকেজ ইনস্টল করতে হবে না। প্যাকেজটির বাইরে থাকা সমস্ত সাইগউইন ঘাঁটিগুলিকে একটি প্যাশেড ডিরেক্টরিতে রাখুন, আপনার সমস্ত সরঞ্জাম অন্য একটি প্যাশেট ডিরেক্টরিতে রেখে দিন এবং আপনি যেতে ভাল।
টেকি জো

অনুমান করে যে এই ফাইলগুলির প্রত্যেকটি কেবলমাত্র একটি ব্যাচ কেন কেবল সেগুলি একটি বড় ফাইলে রাখে না এবং প্রতিটি সময় শুরু করার জন্য টাইমআউট ফাংশনটি ব্যবহার করে।
সিএমএস_95

উত্তর:


1201

ব্যবহার করুন:

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

CALL ব্যবহার না করার সময়, বর্তমান ব্যাচ ফাইলটি বন্ধ হয়ে যায় এবং ডাকা ব্যাচ ফাইলটি কার্যকর করা শুরু করে। এটি এমএস-ডস দিনের প্রথম দিকের এক অদ্ভুত আচরণ।


অদ্ভুত, আমি উইন্ডোজ on-তে "কল" না করে চেষ্টা করেছি এবং আমার মনে আছে এটি কার্যকর হয়েছিল, তবে উইন্ডোজ এক্সপি-তে এই কমান্ডটির প্রয়োজন ছিল। এটা হতে পারে?
অ্যান্ড্রয়েড বিকাশকারী

7
আসল ডস স্পেক অনুযায়ী কল ছাড়াই কমান্ড চেইনিং করা উচিত এবং ফিরে না আসা উচিত। "কল" যুক্ত হওয়ার পূর্বে একটি জনপ্রিয় বিকল্প হ'ল "কমান্ড / সি সেকেন্ড.ব্যাট" এর মতো একটি শিশু কমান্ড প্রম্পট খোলার পাশাপাশি এটিও ফিরে আসবে।
ব্রায়ান নোব্লাচ

1
আমার উইন্ডোজ 7 এন্টারপ্রাইজে সমস্যা ছিল তাই এটি কেবল এক্সপি নয়
রফিকী

6
উইন্ডোজ 10 এ কেবল প্রথম লাইনটি কার্যকর হয়। ফরহেনের উত্তর অবশ্য কাজ করেছে।
রোব্রো

2
ব্যাচ ফাইলগুলিতে কীভাবে পরামিতিগুলি পাস করবেন এবং পরমগুলির মধ্যে একটি হ'ল ফাঁকা স্থান।
জিউস

180

অন্যান্য সমস্ত উত্তর সঠিক: কল ব্যবহার করুন। উদাহরণ স্বরূপ:

 call "msbuild.bat"

ইতিহাস

প্রাচীন ডস সংস্করণগুলিতে ব্যাচের ফাইলগুলি পুনরাবৃত্তভাবে কার্যকর করা সম্ভব ছিল না। তারপরে কল কমান্ডটি চালু করা হয়েছিল যা ব্যাচের ফাইলটি কার্যকর করতে আরেকটি সিএমডি শেল নামে পরিচিত এবং শেষ হয়ে গেলে কলিং সেন্টিমিডে শেলের কাছে এক্সিকিউশন ফিরিয়ে দেয়।

স্পষ্টতই পরবর্তী সংস্করণগুলিতে আর কোনও সিএমডি শেল আর প্রয়োজন ছিল না।

প্রথম দিনগুলিতে অনেক ব্যাচের ফাইলগুলি নির্ভর করে যে কোনও ব্যাচ ফাইল কল করা কলিং ব্যাচ ফাইলে ফিরে আসবে না। অতিরিক্ত সিনট্যাক্স ছাড়াই আচরণটি পরিবর্তন করা ব্যাচ মেনু সিস্টেমের মতো অনেকগুলি সিস্টেমকে ভেঙে ফেলত (মেনু স্ট্রাকচারের জন্য ব্যাচ ফাইলগুলি ব্যবহার করে)।

মাইক্রোসফ্টের মতো অনেক ক্ষেত্রে, পশ্চাদপটে সামঞ্জস্যতা তাই এই আচরণের কারণ।

পরামর্শ

যদি আপনার ব্যাচের ফাইলগুলির নামে ফাঁকা স্থান থাকে তবে নামের চারপাশে উদ্ধৃতিগুলি ব্যবহার করুন:

call "unit tests.bat"

উপায় দ্বারা: যদি আপনার কাছে ব্যাচের ফাইলগুলির সমস্ত নাম না থাকে তবে আপনি এটি করতেও ব্যবহার করতে পারেন (এটি ব্যাচের ফাইল কলগুলির সঠিক ক্রমের গ্যারান্টি দেয় না; এটি ফাইল সিস্টেমের ক্রম অনুসরণ করে):

FOR %x IN (*.bat) DO call "%x"

আপনি কোনও কল করার পরে ত্রুটি-বিচ্যুতিতে প্রতিক্রিয়া জানাতে পারেন। ব্যবহার করুন:

exit /B 1   # Or any other integer value in 0..255

একটি ত্রুটিযুক্ত স্তর ফিরে দিতে। 0 সঠিক সম্পাদন বোঝায়। কলিং ব্যাচ ফাইলে আপনি ব্যবহার করে প্রতিক্রিয়া জানাতে পারেন

if errorlevel neq 0 <batch command>

if errorlevel 1সমস্ত ত্রুটি-বিধি 1 এবং আরও বড়টি ধরতে আপনার কাছে যদি NT4 / 2000 / XP এর চেয়ে বেশি পুরানো উইন্ডোজ থাকে তবে ব্যবহার করুন ।

একটি ব্যাচ ফাইলের প্রবাহ নিয়ন্ত্রণ করতে, এখানে আছে :-(

if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...

অন্যরা যেমন উল্লেখ করেছে: ব্যাচ ফাইলগুলি প্রতিস্থাপনের জন্য বিল্ড সিস্টেমগুলি দেখুন।


সম্মত, তবে লুপ, এই ক্ষেত্রে, ফাইলগুলিকে ভুল (বর্ণানুক্রমিক?) ক্রমে প্রক্রিয়া করতে পারে
ডেভ আর্চার

সুন্দর এবং খুব সম্পূর্ণ উত্তর। আপনি যদি নিয়ন্ত্রণ প্রবাহকে অন্তর্ভুক্ত করছেন তবে লক্ষ্য করা ভাল হবে যে গোটোর পরিবর্তে আপনি কল: লেবেল 1 এবং ব্যাচ ফাইলে 'রিটার্ন' বিবৃতিটি ব্যবহার করে কিছুটা অদ্ভুত গোটো: ইওফ (এবং প্রয়োজন নেই) নিজেকে একটি ইওফ লেবেল তৈরি করুন, এটি ডিফল্টরূপে বিদ্যমান)।
লেগোলাস

errorlevelকমান্ড উদাহরণ আমাকে (cmd কমান্ড কনসোলে) উইন্ডোজ 10 একটি সমস্যা দিলেন। আমি কমান্ডটি সহজভাবে পরিবর্তন করেছি if errorlevel neq echo Houston We have a Problem!। আমার ব্যাচ প্রক্রিয়াটিতে কোনও সমস্যা ছিল না এবং বেশিরভাগই সাধারণত সম্পন্ন হয়, তবে কল স্টেটমেন্টের পরে আমি যেভাবে এই আদেশটি ব্যবহার করেছি, তার প্রতিটি পদক্ষেপে আমি "নেকে এই সময়ে অপ্রত্যাশিত" হয়েছি। এই ভেবে যে তারা না-সমমানের সিনট্যাক্সটি পরিবর্তন করেছে, আমি চেষ্টা করেছি !=এবং এটিও করেছি <>তবে নতুন সিনট্যাক্সের জন্য একই সময়ে "প্রত্যাশিত নয়" ত্রুটি পেয়েছি getting আমি কী ভুল করছি?
টিএমডাব্লুপি

117

যদি আমরা একাধিক কমান্ড প্রম্পটগুলি খুলতে চাই তবে আমরা ব্যবহার করতে পারি

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.

7
এটিই আমরা সন্ধান করছিলাম, যেহেতু আমাদের প্রথম অ্যাপটি
কনসোলটিকে অবরুদ্ধ

1
এটি কমান্ডের একাধিক উদাহরণ চালাবে এবং এমনকী <বিরাম> থাকা একাধিক ব্যাচ ফাইল চালানোর জন্যও কাজ করবে। আমি যে সমাধানটি সন্ধান করছিলাম এটি হ'ল +1!
খ্রিস্টান নোয়েল

5
আপনি দয়া করে ব্যাখ্যা করতে পারেন যে এই উত্তরগুলি আপনার উত্তরটিতে রয়েছে? তাদের উদ্দেশ্য এটি পরিষ্কার নয়।
কালামালকা কিড

3
নোট করুন যে বেশিরভাগ লোকেরা start "Window title" /wait cmd /k call something.batজিনিসগুলি ক্রমানুসারে চালানোর জন্য সম্ভবত ব্যবহার করতে চান ।
অ্যান্ড্রু

3
(বা start "Window title" /wait cmd /c something.bat, যেখানে cmd /cউইন্ডোটি একবার শেষ হয়ে গেলে বন্ধ হয়)
অ্যান্ড্রু


28

আপনি একটি প্রোগ্রাম সংকলনের প্রয়াসে একাধিক ব্যাচ কল করছেন। আমি বিবেচনা করে দেখি যে যদি কোনও ত্রুটি দেখা দেয়:
1) ব্যাচের মধ্যে থাকা প্রোগ্রামটি একটি ত্রুটিযুক্ত সঙ্গে প্রস্থান করবে;
2) আপনি এটি সম্পর্কে জানতে চান।

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

'||' ০. এর চেয়ে বেশি ত্রুটিযুক্তের জন্য পরীক্ষা করা হয় এইভাবে সমস্ত ব্যাচকে ক্রমে ডাকা হয় তবে কোনও ত্রুটি বন্ধ হয়ে যায়, স্ক্রিনটি রেখে যা আপনার কোনও ত্রুটি বার্তা দেখার জন্য এটি।


23

যদি আমাদের কাছে দুটি ব্যাচের স্ক্রিপ্ট থাকে, aaa.bat এবং bbb.bat, এবং নীচের মত কল করুন

call aaa.bat
call bbb.bat

স্ক্রিপ্টটি কার্যকর করার সময়, এটি প্রথমে aaa.bat কল করবে, aaa.bat সমাপ্তির থ্রেডটির জন্য অপেক্ষা করবে, এবং bbb.bat কল করবে।

কিন্তু আপনি যদি aaa.bat জন্য অপেক্ষা করতে bbb.bat ডাকতে বিনষ্ট না চান, তবে ব্যবহারের চেষ্টা শুরু কমান্ড প্রয়োগ করুন:

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


20

কোনও .batফাইলের মধ্যে একটি .batফাইল কল করতে , ব্যবহার করুন

call foo.bat

(হ্যাঁ, এটি নির্বোধ, আপনি যদি foo.batকমান্ড প্রম্পট থেকে যেমন কল করতে পারেন তবে এটি দিয়ে কল করতে পারলে এটি আরও অর্থবোধক হবে , তবে সঠিক উপায়টি ব্যবহার করা উচিত call))


7

আপনার ফাইলের নাম দেখে আপনি কী ন্যান্ট বা পিঁপড়ার (জাভা সংস্করণ) মতো বিল্ড টুল ব্যবহার করার কথা বিবেচনা করেছেন ? আপনি ব্যাট ফাইলগুলির চেয়ে অনেক বেশি নিয়ন্ত্রণ পাবেন।


7

আপনি যদি একবারে অনেকগুলি ব্যাচ ফাইল খুলতে চান তবে আপনি কল কমান্ডটি ব্যবহার করতে পারেন। যাইহোক, কল কমান্ড বর্তমান ব্যাট ফাইলটি বন্ধ করে অন্যটিতে যায়। আপনি যদি একবারে অনেকগুলি খুলতে চান তবে আপনি এটি চেষ্টা করতে পারেন:

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

এবং এরপরে বা পুনরায় শুরু করুন cmd" call..." তবে অনেকগুলি ফাইলের জন্য। এটি উইন্ডোজ 7 এর জন্য কাজ করে তবে আমি অন্যান্য সিস্টেম সম্পর্কে নিশ্চিত নই।


6
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

3

callকমান্ডটি ব্যবহার করুন ! এখানে একটি উদাহরণ:

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

3

সঠিক উদ্ধৃতি দিয়ে (এটি কখনও কখনও জটিল হতে পারে):

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

প্রথম আরগ - শিরোনাম (এই ক্ষেত্রে খালি)
দ্বিতীয় আরগ - / ডি সূচিত ডিরেক্টরিটি চালু করা যেতে পারে, যদি বর্তমান ওয়ার্কিং ডিয়ার (যেমন "% ~ dp0")
তৃতীয় আরগ - কমান্ড চালু করতে চান, "সেমিডি.এক্সি"
4 র্থ আর্গুমেন্ট - কমান্ডের পক্ষে আর্গুমেন্টগুলি, এর ভিতরে যুক্তিগুলির দ্বিগুণ দামের সাথে (এইভাবে আপনি ব্যাচের উদ্ধৃতিগুলির মধ্যে উদ্ধৃতিগুলি এড়িয়ে যান)


2

একের মধ্যে একাধিক স্ক্রিপ্ট চালানো আমার একই সমস্যা ছিল। প্রথম স্ক্রিপ্টটিতে এটি উপস্থিত রয়েছে তা বুঝতে না পেরে আমি এটি প্রথমটিতে মারা যাচ্ছিলাম।

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

:: ScriptA.bat
Do Foo
EXIT
::ScriptB.bat
Do bar
EXIT

আমি আমার 11 টি স্ক্রিপ্টগুলি এক্সিট লাইনগুলি সরিয়ে আবার চেষ্টা করেছি এবং 11 টি একই কমান্ড উইন্ডোতে একবারে একের জন্য ছুটে এসেছিল।

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

::ScriptA.bat
Do Foo

::ScriptB.bat
Do bar

exitগুলি অপসারণ করবেন না , পরিবর্তে তাদের প্রতিস্থাপন করুন goto :eof। এটি "ফিরবে"call
স্টিফান

আপনি বুঝতে পেরেছেন যে একটি সাধারণ ব্যাচের কমান্ডগুলি ক্রম অনুসারে চলবে যা তাদের সূচকের জন্য বেসিক লেআউটও বলা হয় @echo off :menu some commands goto menuনোট এটি বন্ধ না হওয়া পর্যন্ত অবিচ্ছিন্ন লুপ চালাবে। মূলত যদি আপনি আছে আত প্রয়োজন ::মাত্র:
CMS_95

0

নিম্নলিখিতটি আমার সমস্যার সমাধান করেছে:

start call "batch1.bat"
start call "batch2.bat"

0

আপনি এটি চান হতে পারে:

সমান্তরালে ব্যাচ স্ক্রিপ্টগুলি চালান-

start "systemLogCollector" /min cmd /k call systemLogCollector.bat
start "uiLogCollector" /min cmd /k call uiLogCollector.bat
start "appLogCollector" /min cmd /k call appLogCollector.bat

এখানে তিন ব্যাচের ফাইলগুলি ন্যূনতম অবস্থায় পৃথক কমান্ড উইন্ডোতে চালিত হয়। আপনি যদি এগুলি ন্যূনতম করতে চান না, তবে সরিয়ে ফেলুন /min। এছাড়াও, আপনার যদি পরে এগুলি নিয়ন্ত্রণ করার প্রয়োজন না হয় তবে আপনি শিরোনামগুলি থেকে মুক্তি পেতে পারেন। সুতরাং, একটি খালি হাড়ের আদেশ হ'ল-start cmd /k call systemLogCollector.bat


আপনি যদি এগুলি বন্ধ করতে চান-

taskkill /FI "WindowTitle eq appLogCollector*" /T /F
taskkill /FI "WindowTitle eq uiLogCollector*" /T /F
taskkill /FI "WindowTitle eq systemLogCollector*" /T /F
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.