ব্যাচ ফাইল: স্ট্রিং স্ট্রিংয়ে রয়েছে কিনা তা সন্ধান করুন (কোনও ফাইলে নেই)


208

একটি ব্যাচ ফাইলে আমার একটি স্ট্রিং রয়েছে abcdefg। আমি bcdস্ট্রিং মধ্যে আছে কিনা তা পরীক্ষা করতে চাই ।

দুর্ভাগ্যক্রমে এটি মনে হচ্ছে যে সমাধানগুলি আমি একটি স্ট্রিংয়ের জন্য স্ট্রিং নয়, একটি স্ট্রিংয়ের জন্য একটি ফাইল অনুসন্ধান করছি ।

এর কি সহজ সমাধান আছে?


5
BTW, এটা সাধারণত হয় এর Windowsএবং cmd বা এটা ms-dos। এমএসডোস দীর্ঘদিন ধরে উইন্ডোজের অংশ ছিল না ।
paxdiablo

উত্তর:


288

হ্যাঁ, আপনি বিকল্পগুলি ব্যবহার করতে পারেন এবং মূল স্ট্রিংয়ের বিরুদ্ধে পরীক্ষা করতে পারেন:

if not x%str1:bcd=%==x%str1% echo It contains bcd

%str1:bcd=%বিট একটি প্রতিস্থাপন করবে bcdমধ্যে str1একটি খালি স্ট্রিং সঙ্গে, এটা মূল থেকে আলাদা করে।

যদি bcdমূলটিতে এতে কোনও স্ট্রিং না থাকে তবে পরিবর্তিত সংস্করণটি অভিন্ন হবে।

নিম্নলিখিত স্ক্রিপ্টের সাথে পরীক্ষা করা এটি কার্যত প্রদর্শিত হবে:

@setlocal enableextensions enabledelayedexpansion
@echo off
set str1=%1
if not x%str1:bcd=%==x%str1% echo It contains bcd
endlocal

এবং বিভিন্ন রান ফলাফল:

c:\testarea> testprog hello

c:\testarea> testprog abcdef
It contains bcd

c:\testarea> testprog bcd
It contains bcd

কয়েকটি নোট:

  • ifবিবৃতি এই সমাধান মাংস হয়, অন্য সব কিছুর সমর্থন উপাদান।
  • xসমতা দুই পক্ষের সামনে তা নিশ্চিত করার জন্য স্ট্রিং bcdঠিক আছে কাজ করে। এটি নির্দিষ্ট "অনুচিত" শুরুর অক্ষরের বিরুদ্ধেও সুরক্ষা দেয়।

7
: আপনি কিভাবে জন্য লুপ স্ট্রিং রিপ্লেসমেন্ট করতে হবে সেই বিষয়ে খুঁজছেন stackoverflow.com/a/6310580/623622
Czarek Tomczak

60
এটি দুর্দান্ত তবে যখন অনুসন্ধানের মানটি একটি ধ্রুবক (বিসিডির মতো) ছিল না তবে পরিবর্তে পরিবর্তনশীল ছিল তখন আমি এটি কাজ করার জন্য সংগ্রাম করেছি। অনেক পরে আমি অবশেষে এটি সন্ধান। ধরে নিচ্ছি সার্চওয়ালকে ঘোষণা করা হয়েছে, "x! Str1:% searchVal% =!" == "x% str1%"
গ্যারি ব্রানটন

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

6
খুব ভাল সমাধান, তবে আপনাকে ডাবল উদ্ধৃতিতে আবদ্ধ করতে হবে বা এটির ভেরিয়েবলগুলির সাথে কাজ করবে না যার মানগুলিতে শূন্যস্থান রয়েছে, যেমন: "x% str1: bcd =%" == "x% str1%" প্রতিধ্বনি এটি না বিসিডি রয়েছে
হেলজ ক্লিন

4
"'= টিআরআর এই সময়ে অপ্রত্যাশিত ছিল"
বেরিট লারসন 4'15

104

আপনি উত্সের স্ট্রিংটি পাইপ করতে পারেন এবং প্যাটার্নের স্ট্রিংটি পাওয়া গেছে কিনা তা দেখতে findstrতার মানটি পরীক্ষা ERRORLEVELকরতে পারেন। শূন্যের একটি মান সাফল্যের ইঙ্গিত দেয় এবং প্যাটার্নটি পাওয়া গেছে। এখানে একটি উদাহরণ:

::
: Y.CMD - Test if pattern in string
: P1 - the pattern
: P2 - the string to check
::
@echo off

echo.%2 | findstr /C:"%1" 1>nul

if errorlevel 1 (
  echo. got one - pattern not found
) ELSE (
  echo. got zero - found pattern
)

এটি যখন সিএমডি.এক্সইএতে চালিত হয়, আমরা পাই:

C:\DemoDev>y pqrs "abc def pqr 123"
 got one - pattern not found

C:\DemoDev>y pqr "abc def pqr 123" 
 got zero - found pattern

"সন্ধান করুন: পরে / সি পরে যুক্তি অনুপস্থিত একটি প্যাটার্ন পাওয়া যায় নি"
বেরিট লারসেন

47

আমি সাধারণত এটির মতো কিছু করি:

Echo.%1 | findstr /C:"%2">nul && (
    REM TRUE
) || (
    REM FALSE
)

উদাহরণ:

Echo.Hello world | findstr /C:"world">nul && (
    Echo.TRUE
) || (
    Echo.FALSE
)

Echo.Hello world | findstr /C:"World">nul && (Echo.TRUE) || (Echo.FALSE)

আউটপুট:

TRUE
FALSE

আমি জানি না এটি সবচেয়ে ভাল উপায় কিনা।


আমার পুনরাবৃত্তভাবে ফাইলের নামগুলি খুঁজতে এবং তুলনা করা দরকার। এটি ছিল আমার জন্য একমাত্র সমাধান যা কাজ করেছিল! খুব সহজ এবং খুব সহজ।
স্যারজেমস

24

সামঞ্জস্যতা এবং ব্যবহারের স্বাচ্ছন্দ্যের জন্য এটি করতে FIND ব্যবহার করা প্রায়শই ভাল।

আপনি সংবেদনশীলভাবে বা সংবেদনশীলতার সাথে কেসের সাথে মিল রাখতে চান কিনা তাও আপনাকে অবশ্যই বিবেচনা করতে হবে।

Points 78 টি পয়েন্টযুক্ত পদ্ধতি (আমি বিশ্বাস করি যে আমি প্যাক্সিডাবলোর পোস্টের কথা উল্লেখ করছিলাম) কেবল সংবেদনশীলতার সাথে কেসের সাথে মিলবে, সুতরাং আপনি যে প্রতিটি সম্ভাব্য পুনরাবৃত্তিটি মেলাতে পারবেন তার জন্য প্রতিটি ক্ষেত্রে পরিবর্তনের জন্য একটি পৃথক চেক রাখতে হবে।

(কী বেদনা! চেকটি সম্পন্ন করার জন্য মাত্র 3 টি অক্ষরের মানে 9 টি বিভিন্ন পরীক্ষা!)

এছাড়াও, অনেক সময় কমান্ড আউটপুট, একটি লুপের একটি ভেরিয়েবল, বা আপনার ব্যাচ / সিএমডি তে পয়েন্টার ভেরিয়েবলের মান যেটি সরাসরি সোজা হয় না তার সাথে মিলিয়ে যাওয়া ভাল।

এই কারণে এটি একটি বিকল্প বিকল্প পদ্ধতি:

ব্যবহার করুন: [/ I] [/ V] "ম্যাচের চরিত্রগুলি" সন্ধান করুন

[/ আমি] (কেস সংবেদনশীল) [/ ভি] (চরিত্রগুলি অবশ্যই ধারণ করা উচিত নয়)

একক লাইন হিসাবে:

ECHO.%Variable% | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )

মাল্টি লাইন:

ECHO.%Variable%| FIND /I "ABC">Nul && ( 
  Echo.Found "ABC"
) || (
  Echo.Did not find "ABC"
)

যেমনটি উল্লেখ করা হয়েছে এটি এমন জিনিসের জন্য দুর্দান্ত যা ভেরিয়েবলগুলিতে নয় যা স্ট্রিং প্রতিস্থাপনেরও অনুমতি দেয়:

FOR %A IN (
  "Some long string with Spaces does not contain the expected string"
  oihu AljB
  lojkAbCk
  Something_Else
 "Going to evaluate this entire string for ABC as well!"
) DO (
  ECHO.%~A| FIND /I "ABC">Nul && (
    Echo.Found "ABC" in "%A"
  ) || ( Echo.Did not find "ABC" )
)

Output From a command:

    NLTest | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )

As you can see this is the superior way to handle the check for multiple reasons.

সংবেদনশীলতার ক্ষেত্রে, আপনি যদি সংবেদনশীল তুলনা না করেন setlocal EnableExtensionsতবে IF /Iতা ব্যবহার করতে পারেন ।
সাইচোই

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

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

হাই ফোন ট্যাগার, আমি যখন মূল পোস্টটি লিখেছিলাম তখন তিন বছর আগে এটি একটি সহায়ক মন্তব্য ছিল, তবে আপনি উল্লেখ করেছেন যে পয়েন্টের মানগুলি সমস্ত পরিবর্তিত হয়েছে। আমি আর কোন পোস্টের কথা উল্লেখ করছি তা আর মনে নেই এবং আমি আজ পয়েন্টের মান দ্বারা তাদের উল্লেখ করছি না। যাই হোক ধন্যবাদ.
বেন পার্সোনিক

আমি চারপাশে তাকিয়েছিলাম এবং আমি বিশ্বাস করি যে আমি প্যাক্সিডিয়াবলোর উল্লেখ করছি, তাই আমি এটি দেখানোর জন্য পাঠ্যটি সংশোধন করেছি।
বেন পার্সোনিক

10

আপনি যদি উপস্থিতি সনাক্ত করে থাকেন তবে এখানে সবচেয়ে সহজ সমাধান:

SET STRING=F00BAH
SET SUBSTRING=F00
ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE)

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

SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE)

এটি একটি উইন্ডোজ আপডেট পরিষেবাদির জন্য এসসি ক্যোয়ারির আউটপুটকে মূল্যায়ন করে যা একাধিক পাঠ্য হিসাবে প্রকাশিত হয়, "স্টেট" যুক্ত লাইনটি খুঁজে পায় তখন সেই লাইনে "চলমান" শব্দটি পাওয়া যায় কিনা এবং তদনুসারে ত্রুটিযুক্ত স্তর সেট করে sets


6
আপনার যদি আপনার বিবৃতি পশ্চাদপটে থাকে .. abcdefg দিয়ে আসলটির দিকে তাকান এবং আপনি আপনার যুক্তিটি ফ্লিপ-ফ্লপ করেন। এটা কাজ করে। আপনার যেভাবে এটি আছে, তা হয় না। SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
লেপটোনেটর

2
@ লেপ্টোনেটরটি উল্টানো যুক্তি দিয়ে সঠিক হওয়া সত্ত্বেও একটি +1 হয়। এটি একটি সহজ এবং সহজেই ব্যবহারযোগ্য সমাধান।
ল্যারিক্স ডিডিডুয়া

2

আমি সম্ভবত এই উত্তরটি নিয়ে কিছুটা দেরি করে আসছি, তবে গৃহীত উত্তরটি কেবল "হার্ড-কোডেড স্ট্রিং" অনুসন্ধানের স্ট্রিংয়ের একটি অংশ কিনা তা খতিয়ে দেখার জন্য কাজ করে।

গতিশীল অনুসন্ধানের জন্য, আপনাকে এটি করতে হবে:

SET searchString=abcd1234
SET key=cd123

CALL SET keyRemoved=%%searchString:%key%=%%

IF NOT "x%keyRemoved%"=="x%searchString%" (
    ECHO Contains.
)

দ্রষ্টব্য: আপনি দুটি পরিবর্তনশীলকে আর্গুমেন্ট হিসাবে নিতে পারেন।


1

আরও ভাল উত্তর এখানে ছিল :

set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains

যে প্রশ্নটিতে আপনি SET ব্যবহার করে লিঙ্ক করছেন সেটি একটি নির্দিষ্ট এবং অনন্য প্রয়োজন সমাধান করছে, সুতরাং সেখানে "এসইটি" উল্লেখ করা গুরুত্বপূর্ণ। যাইহোক, এটি বর্তমান আলোচনায় কিছু যুক্ত হবে বলে মনে হয় না, কারণ FIND কমান্ডে কোনও কমান্ড পাইপ করার এবং ফলাফল পরীক্ষার পদ্ধতি ইতিমধ্যে সরবরাহ করা হয়েছে
বেন পারসোনিক


0

একটি স্ট্রিংয়ের জন্য ফাইলগুলি অনুসন্ধান করে এমন সমাধানগুলি একটি স্ট্রিংও অনুসন্ধান করতে পারে , যেমন। বা । আপনার ক্ষেত্রে, সহজ সমাধান হ'ল ফাইলের নাম সরবরাহ করার পরিবর্তে কমান্ডটিতে একটি স্ট্রিং পাইপ করা।findfindstr

কেস-সংবেদনশীল স্ট্রিং:
echo "abcdefg" | find "bcd"

স্ট্রিংয়ের ক্ষেত্রে উপেক্ষা করুন:
echo "abcdefg" | find /I "bcd"

যদি কোনও মিল না পাওয়া যায়, আপনি সিএমডি-তে একটি ফাঁকা লাইন প্রতিক্রিয়া পাবেন এবং% ERRORLEVEL% 1 এ সেট করেছেন

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