উইন্ডোজ ব্যাচ ফাইল থেকে% PATH% এ যদি এক্সিকিউটেবল উপস্থিত থাকে তবে কীভাবে পরীক্ষা করবেন?


90

উইন্ডোজ ব্যাচ ফাইল থেকে PATH এনভায়রনমেন্ট ভেরিয়েবলের মধ্যে যদি একটি এক্সিকিউটেবল উপস্থিত থাকে তা পরীক্ষা করার জন্য আমি একটি সহজ উপায় খুঁজছি।

ওএস দ্বারা সরবরাহিত নয় এমন বাহ্যিক সরঞ্জামগুলির ব্যবহার অনুমোদিত নয়। সর্বনিম্ন উইন্ডোজ সংস্করণটি প্রয়োজনীয় উইন্ডোজ এক্সপি।



15
@ কার্ফিলিপ: অবশ্যই নেই। এখানে প্রশ্নটি একেবারেই আলাদা।
জ্যো

4
আপনার গ্রহণযোগ্য উত্তর চিহ্নিত করা উচিত।
জেব

উত্তর:


70
for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
if defined FOUND ...

আপনার যদি বিভিন্ন এক্সটেনশনের জন্য এটির প্রয়োজন হয় তবে কেবল পুনরাবৃত্তি করুন PATHEXT:

set FOUND=
for %%e in (%PATHEXT%) do (
  for %%X in (myExecutable%%e) do (
    if not defined FOUND (
      set FOUND=%%~$PATH:X
    )
  )
)

whereলিগ্যাসি উইন্ডোজ সংস্করণগুলিতে এটি ইতিমধ্যে বিদ্যমান থাকতে পারে তবে আমার একটিতে অ্যাক্সেস নেই তাই আমি বলতে পারি না। আমার মেশিনে নিম্নলিখিতগুলিও কাজ করে:

where myExecutable

এবং যদি এটি খুঁজে না পাওয়া যায় তবে একটি শূন্য-বহির্গমন কোড দিয়ে ফিরে আসে। কোনও ব্যাচে আপনি সম্ভবত আউটপুটটিকে পুনর্নির্দেশ করতে চান NUL, যদিও।

মনে রেখ

ব্যাচ ( .bat) ফাইলগুলিতে এবং কমান্ড লাইনে পার্সিং পৃথক হয় (কারণ ব্যাচ ফাইলগুলি আছে %0- %9), সুতরাং আপনাকে %সেখানে দ্বিগুণ করতে হবে। কমান্ড লাইনে এটি প্রয়োজনীয় নয়, সুতরাং ভেরিয়েবলগুলির জন্য উপযুক্ত %X


4
আমি আপনার পদ্ধতির পছন্দ করি তবে এটি আরও ভাল হবে যদি আপনি সম্পূর্ণ সংস্করণটি সরবরাহ করতে পারেন তবে এটি প্যাচএক্সটাকেও এর জন্য ব্যবহার করে না।
সোরিন

4
এক্সপির জন্য আপনার লুপ স্ক্রিপ্টের প্রয়োজন (বা আরকে থেকে where.exe ডাউনলোড করুন)। ভিস্তা এবং 7 জাহাজ যেখানে.এক্সে সহ। আমি জানি ওপি বিশেষত এক্সপি বলেছিল, তবে উত্তরোত্তর জন্য সর্বদা সর্বোত্তম উত্তরটি ব্যবহার করা উচিত where myExecutable
রায়ান বেমরোজ

রায়ান: হাহ? আমি মনে করি না আমি আপনার বাক্যটি বিশ্লেষণ করতে পারি।
জোয়

4
আমি একজন ব্যাচের স্ক্রিপ্টিং সূচনা এবং নিশ্চিত নই যে%% x এর অর্থ কী। আমার উইন্ডোজ 7 সিস্টেমে আমি টাইপ করার চেষ্টা করেছি: %% এক্স-এর জন্য (মাইএক্সেকটেবল.এক্সই) করুন (সেট করুন FOUND = %% ~ AT पथ: এক্স) এবং তারপরে হিট করুন। আমি প্রতিক্রিয়াতে এটি পেয়েছি: সি: \ ব্যবহারকারীগণ \ জেমস>% ৯ এক্স এর জন্য (সেন্টিমিডি.এক্সি) করুন (সেট করুন FOUND = %% ~ AT पथ: এক্স) %% এক্স এই সময়ে অপ্রত্যাশিত ছিল।
সিমিনাইজার

4
simengineer: ব্যাচ ফাইল এবং কমান্ড লাইনে পার্সিং পৃথক (কারণ ব্যাচ ফাইলগুলি আছে %0- %9), তাই আপনাকে %সেখানে দ্বিগুণ করতে হবে। কমান্ড লাইনে এটি প্রয়োজনীয় নয়, সুতরাং forভেরিয়েবলগুলি ন্যায়বিচারযোগ্য %x
জোয়ি

82

উইন্ডোজ ভিস্তা এবং পরবর্তী সংস্করণগুলি এমন একটি প্রোগ্রাম সহ শিপ where.exeকরে যা এই পথে প্রোগ্রামগুলির সন্ধান করে। এটি এর মতো কাজ করে:

D:\>where notepad
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe

D:\>where where
C:\Windows\System32\where.exe

ব্যাচ ফাইলে ব্যবহারের জন্য আপনি /qস্যুইচটি ব্যবহার করতে পারেন যা কেবল সেট করে ERRORLEVELএবং কোনও আউটপুট উত্পাদন করে না।

where /q myapplication
IF ERRORLEVEL 1 (
    ECHO The application is missing. Ensure it is installed and placed in your PATH.
    EXIT /B
) ELSE (
    ECHO Application exists. Let's go!
)

বা একটি সাধারণ (তবে কম পঠনযোগ্য) শর্টহ্যান্ড সংস্করণ যা বার্তাটি প্রিন্ট করে এবং আপনার অ্যাপ্লিকেশনটি প্রস্থান করে:

where /q myapplication || ECHO Cound not find app. && EXIT /B

খুব সুন্দর এবং সাধারণ! ধন্যবাদ!
পাভেল সিওচ

18

এখানে একটি সহজ সমাধান যা অ্যাপ্লিকেশনটি চালানোর চেষ্টা করে এবং পরে কোনও ত্রুটি পরিচালনা করে ।

file.exe /?  2> NUL
IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path

ত্রুটি কোড 9009 এর অর্থ সাধারণত ফাইল পাওয়া যায় না।

একমাত্র নেতিবাচকতা হ'ল file.exeযদি পাওয়া যায় তবে এটি কার্যকর করা হয় (যা কিছু ক্ষেত্রে কাম্য নয়)।


24
কেবলমাত্র খারাপ দিকটি হ'ল "file.exe" কার্যকর করা হয় (যা কিছু ক্ষেত্রে অযাচিত হয়)
ইডমাস্টার

6

এটি পরামিতি প্রতিস্থাপনের মাধ্যমে সম্পন্ন করা যেতে পারে।

%~$PATH:1

এটি% 1 এ এক্সিকিউটেবল ফাইলের পুরো পথটি ফেরত দেয়, অন্যথায় একটি খালি স্ট্রিং।

এটি ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবলগুলির সাথে কাজ করে না। সুতরাং যদি এক্সিকিউটেবল ফাইলের নামটি আপনার স্ক্রিপ্টের প্যারামিটার না হয় তবে আপনার একটি সাবট্রাইন দরকার। উদাহরণ স্বরূপ:

call :s_which app.exe
if not "%_path%" == "" (
  "%_path%"
)

goto :eof

:s_which
  setlocal
  endlocal & set _path=%~$PATH:1
  goto :eof

Http://ss64.com/nt/syntax-args.html দেখুন


4
সঙ্গে আকর্ষণীয় কৌতুক setlocalকিন্তু for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)সঙ্গে এক লাইন সমাধান forজন্য কার্যসংক্রান্ত হিসাবে ব্যবহার %%~$PATH:Xএড়ানোর জন্য callএবং %~$PATH:1
gavenkoa

0
@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....

4
forসামগ্রীর বিষয়বস্তু বিশ্লেষণ করার মতো স্মার্ট নয় বলে কাজ করবে না PATH। উদাহরণস্বরূপ, এটি স্পেস সহ ডিরেক্টরিগুলি মিস করবে। এমনকি আপনি এটির for /fসাথে ব্যবহার করার পরেও delims=;যদি কোনও ডিরেক্টরিতে একটি থাকে ;এবং উদ্ধৃত হয় তবে সঠিকভাবে কাজ করবে না ।
জোয়

@ জোয়ি, স্ট্রিং প্রতিস্থাপন সম্পর্কে কীভাবে? প্রতিস্থাপন ;সঙ্গে "; ": set quotedPath="%PATH:;="; "%"
এক্সপি 1

4
এক্সপি 1: নাহ, এখনও অকেজো। "C:\Folder with; semicolon, quoted"পথে সংযোজন করে এটি চেষ্টা করুন এবং দেখুন কী ঘটে। কমপক্ষে এখানে এটি প্রতিটি »শব্দ« আলাদাভাবে চিকিত্সার চেষ্টা করে যা একরকমভাবে আগের আচরণের চেয়ে খারাপ।
জো

0

কখনও কখনও এই সহজ সমাধান কাজ করে, যেখানে আউটপুট আপনার প্রত্যাশার সাথে মিলছে কিনা তা পরীক্ষা করে দেখুন। প্রথম লাইনটি কমান্ডটি চালায় এবং স্ট্যান্ডার্ড আউটপুটটির শেষ লাইনটি ধরে।

FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.

তবে যদি সিস্টেমের পরিবেশটি অন্য ভাষা ব্যবহার করে?
বিচওয়াককার

0

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

@echo off
cd C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
where /q program.exe
IF ERRORLEVEL 1 (
echo F | xcopy /Y /S /I /E "\\programsetup\programsetup.exe" 
"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\program.exe"
) ELSE (
ECHO Application exists. Let's go!
)

তবে এটি program.exeকেবল একটি ফোল্ডারে নয়, পুরো প্যাথএইচএই অনুসন্ধান করে
jeb

-1

কমান্ডটি ব্যবহার করুন: পাওয়ারশেল টেস্ট-পাথ "আপনি যা খুঁজছেন"

এটি উপস্থিত থাকলে সত্যটি ফিরে আসবে, অন্যথায় মিথ্যা।


এটি কাজ করবে না। Test-Pathকেবলমাত্র নির্দিষ্ট পাথটি পরীক্ষা করে, অর্থাত্ বর্তমান ডিরেক্টরিতে Test-Path nuget.exeথাকলে সত্য nuget.exeহয়। যদি nuget.exe বর্তমান ডিরেক্টরিতে না থাকে তবে এটি PATH ভেরিয়েবলের তালিকাভুক্ত ডিরেক্টরিতে থাকলেও এটি মিথ্যা প্রত্যাবর্তন করবে। পাওয়ারশেলের মধ্যে Get-Commandআরও ভাল কাজ করা হতে পারে ( স্ট্যাকওভারফ্লো / প্রশ্ন / ১১১৪৪৩6868৮/২ ), তবে একথা বিবেচনা করুন যে পাওয়ারশেলের জন্য বর্তমান ডিরেক্টরিটি চলবে না।
রোনাল্ড জারেটস

4
@ রোনাল্ডজারিটস যেমন উল্লেখ করেছেন যে, সম্পূর্ণ পাওয়ারশেল সমর্থনের জন্য, আপনি দুটি বিকল্পের সাথে গেট-কমান্ড ব্যবহার করতে পারেন। প্রথমে বর্তমান দির লোকেশন দিন, তারপরে কেবল এক্সি নাম দিন। (Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $nullস্থানীয় বা পথের সন্ধান পেলে সত্য ফিরে আসবে।
জন সি

-1

যারা পাওয়ারশেল বিকল্প খুঁজছেন তাদের জন্য। আপনি Get-Commandদুটি আইটেম পাস করে সেমিডলেট ব্যবহার করতে পারেন । প্রথমে বর্তমান দিরের অবস্থানটি .\উপসর্গযুক্ত দিয়ে দিন, তারপরে কেবল নামটির নাম দিন।

(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null

স্থানীয় বা সিস্টেমের প্রশস্ত পথে যদি এটি পাওয়া যায় তবে তা সত্য হবে।


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