ব্যাচ ফাইলে কমান্ডটি স্বীকৃত কিনা তা নির্ধারণ করুন


43

আমি একটি ব্যাটের স্ক্রিপ্ট লিখছি যাতে আমি কোনও প্রোগ্রাম (যেমন জাভাক) শুরু করি। সরলতার জন্য, আমি কমান্ডটি চালানোর আগে উপস্থিত আছে কিনা তা পরীক্ষা করে দেখতে চাই। অর্থাত্ কমান্ডটি যদি PATH তে বিদ্যমান থাকে।

উদাহরণ স্বরূপ,

if (my_command.exe is a recognized command) then (
  my_command.exe my_args
) else (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file."
  REM Do not run my_command.exe
)

উইন্ডোজে এটি করার সর্বোত্তম উপায় কী?


আপনি কীভাবে আপনার আদেশকে "স্বীকৃতি" দেবেন?
দাড়কাক

এমএস-ডস (সত্য ডস) এ এটি বরং সহজ ছিল; আপনি কেবলমাত্র সি: \ ডক্সে একটি এক্সিল ফাইলটির অস্তিত্ব পরীক্ষা করেছেন; তবে তবুও প্রশ্ন থেকেই যায় remains
দাড়কাক

বিভ্রান্তির জন্য দুঃখিত. আমি মূলত উইন্ডোজে একটি কমান্ড প্রম্পট বলতে চাইছিলাম। আমি যদি "lkajsflksajdfj" টাইপ করি তবে আমি এটি সনাক্ত করতে চাইছি এটি কোনও আদেশ নয়। আমি যদি "notepad.exe" টাইপ করি তবে ঠিক আছে।
ব্যবহারকারী46097

উত্তর:


54
WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found 

10
যদি কেউ সিএমডি উইন্ডোর ভিতরে আউটপুট না চান তবে কেবল এর >nul 2>nulপিছনে যুক্ত করুন mycommand
সেবাস্তিয়ান

নোট করুন যে 1 এবং 2 এর চেয়ে বেশি আউটপুট চ্যানেল রয়েছে, যেহেতু 1 টি আউটপুট বাফার এবং 2 ত্রুটি বাফারের জন্য দাঁড়িয়েছে, এটি অ্যাপ্লিকেশনটি কীভাবে বিকাশ করা হয়েছিল তার উপর নির্ভর করে, এটি উইন্ডোজ দিয়ে যে সাধারণ অ্যাপ্লিকেশনগুলি চালিত করে তাদের জন্য কাজ করা উচিত, তবে একটি নির্দিষ্ট সিএলআই প্রোগ্রাম পারে 1 এবং 2 চ্যানেলগুলি পুনঃনির্দেশিত করা হলে এখনও পাঠ্য ছোঁড়া।
এলেক্ট্রো স্টুডিওগুলি

15

নীচের কোডটি সর্বদা কোনও জঞ্জাল আউটপুট না দিয়ে পরিষ্কারভাবে কার্যকর করা উচিত।

javac -version >nul 2>&1 && (
    echo found javac
) || (
    echo fail
)

আউটপুট:

found javac

ওয়ান-লাইনারের মতো একই কোড:

javaz -version >nul 2>&1 && ( echo found javac ) || ( echo fail )

আউটপুট:

fail

নোট করুন যে ক্রম &&এবং ||মনে হচ্ছে। এছাড়াও, আপনি যে কমান্ডটির অস্তিত্বের জন্য পরীক্ষা করছেন সেটিকে কাজ করার জন্য একটি ত্রুটিযুক্ত <= 0 দিয়ে ফিরে আসা দরকার। আশা করি কমান্ডটি আছে /? বা --help আর্গুমেন্ট বা জাভা হিসাবে একটি সংস্করণ তথ্য কমান্ড।


এই সমাধান নিখুঁত!
robe007

7

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

for %%x in (my_command.exe) do if not [%%~$PATH:x]==[] set MyCommandFound=1

একটি বিকল্প যা %PATH%পরিবেশ পরিবর্তনশীল দ্বারা তালিকাভুক্ত পাথগুলিতে প্রোগ্রামটির জন্য অনুসন্ধান করে । এটি মূলত একটি খাঁটি ব্যাচের সংস্করণ which(1)। এটি আরও ভাল করা যায় তবে মূলত এটি।


1
এটি নিখুঁত, ঠিক যা চেয়েছিল তা করে!
পেজ কোকো

3

আমার পরিস্থিতির জন্য। পরম সরলতম উপায়টি || বা && অপারেটর।

my_command.exe -version 2>NUL && echo "my_command exists"

অথবা

my_command.exe -version 2>NUL || echo "my_command doesn't exist"

আপনি কেন স্টাডাউট পুনর্নির্দেশ করবেন না?
জো

3

নীচের সংস্করণে কিছু পরিমার্জন। কমান্ডটি উপস্থিত রয়েছে এবং পরীক্ষা ছাড়াই অপ্রয়োজনীয় আউটপুট দমন করে।

WHERE scp >nul 2>nul
IF %ERRORLEVEL% EQU 0 ECHO scp found

যেখানে <my_exe> NUL 2> & 1 || প্রতিধ্বনি my.exe এর অস্তিত্ব নেই && তেমন: ইওএফ স্ক্রিপ্টগুলিতে দুর্দান্তভাবে কাজ করে
রবার্ট

এনবি: আপনি যে ফাইলের নামটি পরীক্ষা করতে চান তার মধ্যে পথের তথ্য অন্তর্ভুক্ত থাকলে এটি কাজ করে না। উদাহরণস্বরূপ, WHERE \Windows\System32\cmd.exe=>INFO: Could not find files for the given pattern(s).
জোনাথন গিলবার্ট

1

অতিরিক্ত সরঞ্জাম ইনস্টলেশন প্রয়োজন হলে ঠিক আছে, whereরিসোর্স কিটস একটি কমান্ড আছে; উইন্ডোজ কোথায় এর সমতুল্য দেখুন ?

অন্যথায়, উইন্ডোজের যে সংস্করণগুলি খুব বেশি প্রাচীন নয়, তাদের পক্ষে এটি খাঁটিভাবে কার্যকর cmd, যেমনটি ডাস এক্সিকিউটেবল লুপ ইন প্যাট ব্যতীত উল্লিখিত রয়েছে ।


তিরস্কার করার জন্য ধন্যবাদ! দুর্ভাগ্যক্রমে, প্রয়োজনীয়তার একটি হ'ল এটি একটি ভ্যানিলা বাক্সে চালিত করতে হবে (এক্সপি মেশিন অন্তর্ভুক্ত) - যাতে এটি কোনও বিকল্প নয়।
ব্যবহারকারী46097

2
গিলস দ্বিতীয় লিঙ্কটি দিয়েছিল একটি নিফটি সমাধান যা ব্যবহার করে কোনও অতিরিক্ত সরঞ্জাম।
প্যারাড্রয়েড

1

আপনি যা খুঁজছেন তা আমি একেবারেই জানি না, তবে যুক্তিতে কিছুটা পরিবর্তন আনার সাথে এটি আপনার প্রয়োজনীয়তা অর্জন করবে।

প্রতিটি কমান্ড যা চালিত হয় তার একটি রিটার্ন কোড থাকে (ওরফে ত্রুটিযুক্ত), যদি রিটার্ন কোড 0 (শূন্য) হয়, কমান্ডটি সফলভাবে চালিত হয়েছে, যদি রিটার্ন কোড 0 এর চেয়ে বড় হয় তবে কিছু ভুল হয়েছে।

দেখুন এখানে আরো বিস্তারিত জানার জন্য।

কিছুটা এইরকম -

my_command
if (%ERRORLEVEL% > 0) then (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file.  OR SOMETHING WENT WRONG WITH IT."
  REM Do not run my_command.exe
)

এটি চতুর, আমি এটি পছন্দ করি।
শিনরাই

হ্যাঁ, তবে এটি কুরুচিপূর্ণ, যদি কমান্ডটি খুঁজে না পাওয়া যায় তবে এটি একটি 2 লাইনের ত্রুটি ছুড়ে ফেলে। সুতরাং, একটি ক্লিনার সমাধান সম্ভবত পাওয়া যেতে পারে।
jangofan

0

যদিও এই সমস্ত উপায়ে কাজ করতে পারে, তবে বিল্ট কেন না?

If exists my_command do echo "my_command exists"

"যদি /" চালান? বিস্তারিত জানার জন্য কমান্ড লাইনে


5
এটি কেবলমাত্র সেই নামের নামের একটি ফাইল / ডিরেক্টরি বর্তমান ডিরেক্টরিতে বিদ্যমান কিনা তা দেখতে পাবে। এই নামটি সহ একটি চলমান কমান্ড উপস্থিত রয়েছে কিনা তা ইঙ্গিত দেয় না কারণ আপনাকে অনুসন্ধানটি অনুসন্ধান করতে হবে তা নির্ধারণ করতে PATH
জোয়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.