প্রোগ্রাম শুরু করুন, এটি নির্দিষ্ট স্ট্রিং আউটপুট পর্যন্ত অপেক্ষা করুন, তারপর অবিরত


3

আমি আমার ব্যাচ স্ক্রিপ্টটি একটি ব্যাচ স্ক্রিপ্ট চালাতে চাই, যা শেষ হয় না, তারপরে আরও অনেক ব্যাচ স্ক্রিপ্ট চালায় যা শেষ হয় এবং তারপর প্রথম ব্যাচ স্ক্রিপ্টটি বন্ধ করে।

ইস্যু হল, প্রথম ব্যাচের স্ক্রিপ্টটি শুরু করার আগে আমি অন্য কোনও চালনা শুরু করতে পারার আগে একটি সংযোগ স্থাপন করতে হবে এবং এটি কখন করা হবে তা নির্ধারণ করতে আমার প্রথম স্ট্রিটের আউটপুটটি দেখতে হবে যা আমি স্ট্রিংয়ের জন্য শুরু করব যা নির্দেশ করে যে সংযোগটি প্রতিষ্ঠিত.

ছদ্ম-কোডে,

start first script
wait for first script to output specific string
while the first script remains running:
    run several other scripts
close the first script

কয়েকটি পূর্ববর্তী লাইন মুদ্রিত হওয়ার পরে এই স্ট্রিংটি প্রদর্শিত হবে। লাইন সংখ্যা এবং এই লাগে উভয় সময় পরিবর্তিত হতে পারে। স্ট্রিং সব সময়ে outputted হয় না। আমি এই স্ক্রিপ্ট পরিবর্তন করতে পারবেন না।

পছন্দসই ফলাফল এই হল:

C:\>first_batch_script.bat
Some line
Doing a thing
Winning the points
The Sims did this joke better
Connection established
certain string
C:\>other_batch_script.bat
other_batch_script is done!
C:\>another_batch_script.bat
another_batch_script is done!
C:\>REM kill first_batch_script.bat

এই কোডটি আমি চেষ্টা করছি:

FOR /f "tokens=* delims=" %%L IN ('first_batch_script.bat ^| find "certain string"') DO echo %%L
call other_batch_script.bat
call another_base_script.bat
REM kill first_batch_script.bat

ব্যবহার FOR /f প্রতিশ্রুতিশীল মনে হচ্ছে, কিন্তু যখন আমি এটি চালাচ্ছি তখন ব্যাচ স্ক্রিপ্ট বেশ ধীরে ধীরে রান করে এবং তারপর ঝুলতে থাকে। কোনও ইভেন্টে, এমনকি যদি এটির মধ্য দিয়ে দৌড়াতে থাকে, তবে আমি লুপটি ভেঙ্গে দেওয়ার জন্য এবং আমার কোডটি কার্যকর করার জন্য একটি ভাল উপায় দেখছি না

ব্যবহার START /WAIT সাহায্য করে না কারণ প্রথম স্ক্রিপ্টটি আমি শুরু করি না (এবং নাও) বন্ধ করতে হবে। যেকোনো ধরনের টাইমিং পদ্ধতি ব্যবহার করা ঠিক কাজ করবে না কারণ এটি সংযোগ স্থাপন করার জন্য মোটামুটি ভিন্ন সময় নিতে পারে।

তাই, দীর্ঘ এবং সংক্ষিপ্ত:

আমি কিভাবে একটি ব্যাচ স্ক্রিপ্টের আউটপুট নিরীক্ষণ করব, এবং একটি নির্দিষ্ট স্ট্রিং দেখা হলে শুধুমাত্র অতিরিক্ত স্ক্রিপ্টগুলি চালানো হবে?


আপনি এতদূর আপনার কাছে স্ক্রিপ্ট শেয়ার করতে পারেন? এবং আপনার প্রশ্ন ঠিক কি?
CharlieRB

এটি একটি ব্যাচ স্ক্রিপ্ট হতে হবে একটি নির্দিষ্ট কারণ আছে? অটোআইটি নামে পরিচিত স্ক্র্যাপিং ভাষা / প্রোগ্রাম ব্যবহার করে আপনি লক্ষ্য অর্জন করতে পারছেন কিনা তা যদি আপনি দেখতে না পারেন। প্রয়োজন হলে আপনি ব্যাচ এবং AutoIt একত্রিত করতে পারে।
Ivan Viktorovic

@ ইভানভিকটোরভিক এটি ব্যবহার করে উত্তর দেবার জন্য বিনা দ্বিধায়, কিন্তু আমি এটির একটি দ্রুত, সহজ টুকরা কোড চাই যা পছন্দ করি, অতিরিক্ত নির্ভরতাগুলি নয়, এটির সাথে পরিচয় করিয়ে দিতে হবে। কিন্তু যদি এটি সর্বোত্তম উপায় হয় তবে এটি সর্বোত্তম উপায়।
KRyan

@CharlieRB যে সম্পর্কে দুঃখিত, স্থির।
KRyan

উত্তর:


1

আমি আপনার প্রয়োজন সঠিকভাবে বুঝতে তারপর for /f অভ্যন্তরীণ প্রক্রিয়া শেষ না হওয়া পর্যন্ত এটি কাজ করবে না। আপনি এই উদাহরণের মতো ফাইলটিতে সিঙ্ক্রোনাইজ করার চেষ্টা করতে পারেন:
(এই আপনার নির্ভরশীল স্ক্রিপ্ট ফাইল হবে, বলুন wait.bat ):

@echo off

:loop
timeout /t 1
(type res.txt |find "trip")  > nul 2>&1
if errorlevel 1 goto loop
echo I can go!

cmd উইন্ডোতে এটি শুরু করুন, তারপর দ্বিতীয় cmd (একই dir) খুলুন এবং চালান (আবার উদাহরণ হিসাবে):
ping localhost |find "trip" >res.txt
পিং আউটপুট 'ট্রিপ' এর পরেই আপনি 'যেতে পারেন' দেখতে পাবেন (হ্যাঁ এটি শীঘ্রই পরে চলে যায় তবে আপনার মূল স্ক্রিপ্ট / প্রক্রিয়াটির প্রয়োজন নেই)

এছাড়াও আপনি সাধারণত আপনার প্রধান স্ক্রিপ্ট শুরু হবে যে নোট করুন! এটি নিশ্চিত করে যে সিঙ্ক্রো ফাইলটি খালি হয়ে যায়।

আপনি ঠিক কি অপেক্ষা করার জন্য বলছেন না - সম্ভবত এটি যাচাই করার আরও সহজ উপায় রয়েছে? (উদাহরণস্বরূপ, খোলা সংযোগ চেক করতে নেটস্ট্যাট ব্যবহার করে)?


আমি সঠিকভাবে অপেক্ষা করার জন্য অপেক্ষা করছি না কারণ আমি সেই বিকল্পগুলির অন্বেষণ করার চেষ্টা করে উত্তরগুলিতে আগ্রহী নই। যে কোনো হারে, আমার ভয় আবার নিশ্চিত করার জন্য আপনাকে ধন্যবাদ: FOR /f; আমি আশা করি যে কেউ তার জন্য একটি কাজকর্ম জানতে হবে। যাইহোক, এই উত্তরটি আমাকে সাহায্য করে না কারণ আমি যে স্ক্রিপ্টটি চালাচ্ছি তা সংশোধন করতে পারছি না (স্ক্রিপ্টটি আপডেট হওয়ার সময় এই সম্পাদনাগুলি কেবল মুছে ফেলা হবে এবং আমি এটিকে পরিবর্তন করার জন্য অনুমোদিত নই) তবে আমি তথ্যটির প্রশংসা করি , তাই +1।
KRyan

আপনি এটি সংশোধন করতে হবে না। আপনার মাস্টার (আমার উদাহরণে পিং) কমান্ডটি একটি ব্যাচ ফাইলে কমান্ড রাখুন, আপনার নির্ভরশীল স্ক্রিপ্টগুলি লুপের নিচে দ্বিতীয় ব্যাচের মধ্যে রাখুন (যেখানে আমি 'যেতে পারি') এবং তৃতীয় ব্যাচ তৈরি করব যা শুধুমাত্র অন্য দুটি (শুরুতে) শুরু করবে।
wmz

দুঃখিত এমনকি সহজ: আপনার মাস্টার (আমার উদাহরণে পিং) রাখুন, একটি ব্যাচ ফাইলে কমান্ড রাখুন start myMaster.bat উপরে wait.bat, লুপের নিচে আপনার নির্ভরযোগ্য স্ক্রিপ্টগুলি রাখুন (যেখানে আমি 'আমি যেতে পারি' রাখি)
wmz

আহ, আমি মনে করি দেখুন। আমি এই মুহূর্তে এই মুহূর্তে পরীক্ষা করতে পারছি না, কিন্তু আমি বিশ্বাস করি এটি কাজ করবে। আমি একবার নিশ্চিত যে আমি স্বীকার করব।
KRyan

ধন্যবাদ, এটা পুরোপুরি কাজ করে। আপনি যেখানে রাখা বোঝানো আউট এটি একটি জিনিস এটি নিয়েছে, কিন্তু এটি কাজ করে।
KRyan

0

আপনি ভুল পদ্ধতির ব্যবহার করছেন মত ​​এটা শোনাচ্ছে। এমন অপারেটর রয়েছে যা আপনি কিছুতে আউটপুট পাইপ করতে ব্যবহার করতে পারেন তবে একটি প্রোগ্রামে কিছু পাইপ করতে পারেন।

দ্বিতীয় পদ্ধতি আপনাকে একটি কমান্ডলাইন প্রোগ্রাম যেমন FTP.exe, এবং আপনি যা লিখছেন তা নিয়ন্ত্রণ করতে মঞ্জুরি দেবে, এটি ঠিক যেভাবেই আপনার দরকার।

এমন একটি পাঠ্য ফাইল তৈরি করুন যা আপনার নিজের কী কী চাপগুলি আছে সেগুলি তৈরি করুন, যখন একটি এন্টারপ্রাইজ প্রয়োজন তখন একটি এন্টার টিপুন, তাই প্রতিটি কমান্ড নিজের লাইনে প্রদর্শিত হয়।

উদাহরণ স্বরূপ input.txt:

MyUsername
qwertyPasswd
y
2
3
quit

উপরে প্রথম প্রবেশ করবে MyUsername এবং এন্টার চাপুন। তারপর এটি দ্বিতীয় লাইন লিখতে হবে, ইত্যাদি।

এখন, আপনার প্রোগ্রামটি শুরু করুন এবং এতে পাঠ্য ফাইল পাইপ করুন:

C:\>ftp.exe <input.txt

আদেশ একটি ভাঙ্গন:

C:\>ftp.exe এটি একটি প্রোগ্রাম যা আপনি চলমান হতে পারে একটি উদাহরণ।

<input.txt নোট করুন & lt; অক্ষর, এই ইনপুট.txt কন্টেন্ট ইনপুট এবং ব্যবহারকারীরুপ হিসাবে এটি আচরণ।

মনে রাখবেন যে প্রোগ্রাম কীবোর্ড ইনপুট আশা করে না, পাইপ এটি সরবরাহ করার জন্য অপেক্ষা করবে।


না, এই আমি দূরবর্তী প্রয়োজন কি না। আমি যে কমান্ডগুলি ইস্যু করি তা প্রথম প্রোগ্রামে কমান্ড নয়, বরং পৃথক ব্যাচ স্ক্রিপ্টগুলি। তারা শুধু প্রথম প্রোগ্রাম দ্বারা প্রতিষ্ঠিত সংযোগ ব্যবহার করুন।
KRyan

আপনি অন্যের জন্য ইনপুট হিসাবে এক স্ক্রিপ্টের আউটপুট ব্যবহার করতে পারেন। হয়তো এটা এখনও কাজ করে। এই ব্যবহার করতে | অক্ষর। প্রোগ্রাম 1 | প্রোগ্রাম 2 যেখানে প্রোগ্রাম 1 এর আউটপুট প্রোগ্রাম 2 এর আউটপুটে প্রেরণ করা হবে। (অথবা এই ক্ষেত্রে স্ক্রিপ্ট)
LPChip

আমি উইন্ডোজ স্ক্রিপ্টিংয়ের সাথে যথেষ্ট পরিচিত নই, তবে প্রথম স্ক্রিপ্ট আলাদা দৃষ্টান্তে একাধিক লাইন আউটপুট করার সময় কীভাবে কাজ করবে তা কতটা ভাল। পাইপ স্ক্রিপ্ট যত তাড়াতাড়ি পায় পায় কোন ইনপুট, এটা স্ট্রিং পাবেন না। যদি এটি প্রথম স্ক্রিপ্টটি বন্ধ করে দেওয়ার জন্য অপেক্ষা করে তবে এটি ঘটতে যাচ্ছে না কারণ এটি (এবং নাও) বন্ধ হওয়া উচিত।
KRyan

আমি উত্তর দিতে পারছি না কারণ আমার স্ক্রিপ্টের অপর্যাপ্ত জ্ঞান আছে। আপনি এটি চেষ্টা করে দেখুন এবং কি ঘটতে হবে।
LPChip
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.