बैच फ़ाइल: खोजें कि स्ट्रिंग स्ट्रिंग में है (फ़ाइल में नहीं)


208

एक बैच फ़ाइल में, मेरे पास एक स्ट्रिंग है abcdefg। मैं जाँच करना चाहता हूँ अगरbcd स्ट्रिंग में है।

दुर्भाग्य से यह लगता है कि सभी समाधान मैं एक फ़ाइल खोज रहा हूँ लिए एक , विकल्प के लिए स्ट्रिंग नहीं।

क्या इसके लिए कोई आसान उपाय है?


5
BTW, यह आमतौर पर या तो है Windowsऔर cmd या यह है ms-dos। MSDOS लंबे समय तक विंडोज का हिस्सा नहीं रहा है ।
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
यह बहुत अच्छा है लेकिन मैंने इसे काम करने के लिए संघर्ष किया जब खोज मूल्य एक स्थिर (जैसे एलसीडी) नहीं था, बल्कि एक चर था। बहुत समय के बाद आखिरकार मुझे इसका पता चला। SearchVal को मान लिया गया है, "x! Str1:% searchVal% =!" == "x% str1%"
गैरी ब्रंटन

7
@ गैरी, चूंकि यह इस प्रश्न की आवश्यकताओं में से एक नहीं था, इसलिए आपको शायद एक अलग सवाल पूछना चाहिए, शायद एक संदर्भ के रूप में इसे वापस लिंक करना। मदद करने के लिए तैयार लोगों की कोई कमी नहीं है। वास्तव में, आप अभी भी जोर से उस प्रश्न को पूछते हैं और इसका उत्तर स्वयं देते हैं (अब यह पता लगा लिया है कि आप इसे खोज रहे हैं) ताकि यह भविष्य के खोजकर्ताओं के लिए उपयोगी हो। स्व-उत्तर देना स्वीकार्य माना जाता है।
पैक्सिडाब्लो

6
बहुत अच्छा समाधान है, लेकिन आपको दोहरे उद्धरण चिह्नों में संलग्न करने की आवश्यकता है या यह उन चर के साथ काम नहीं करेगा जिनके स्थान में मान हैं, जैसे: "x% str1: bcd =%" == "x% str1%" गूंज नहीं इसमें bcd
Helge Klein

4
"'= str1 इस समय अप्रत्याशित था"
बेरीट लार्सन

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
)

जब इसे CMD.EXE में चलाया जाता है, तो हमें यह मिलता है:

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

"FINDSTR: / C के बाद गायब हुआ तर्क - एक - पैटर्न नहीं मिला"
बेरीट लार्सन

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 का उपयोग करना बेहतर होता है।

आपको इस बात पर भी विचार करना चाहिए कि क्या आप मामले को संवेदनशील तरीके से मैच करना चाहते हैं या असंवेदनशील तरीके से।

78 अंकों के साथ विधि (मेरा मानना ​​है कि मैं paxdiablo के पद का उल्लेख कर रहा था) केवल केस सेंसिटिव रूप से मेल खाएगी, इसलिए आपको हर संभावित पुनरावृत्ति के लिए हर मामले की भिन्नता के लिए एक अलग जांच डालनी होगी जिसे आप मैच करना चाहते हैं।

(क्या दर्द है? चेक को पूरा करने के लिए केवल 3 अक्षरों का मतलब है कि 9 अलग-अलग परीक्षण!)

इसके अलावा, कई बार कमांड आउटपुट, लूप में एक वैरिएबल, या आपके बैच / सीएमडी में एक पॉइंटर वैरिएबल के मान का मिलान करना बेहतर होता है, जो सीधे आगे नहीं होता है।

इन कारणों से यह एक बेहतर वैकल्पिक पद्धति है:

का प्रयोग करें: [/ I] [/ V] "वर्ण से मिलान करने के लिए" खोजें

[/ 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
यह वास्तव में एक विकल्प नहीं है क्योंकि आपको "आईएफ" तुलना के लिए पात्रों को अलग करना होगा। अगर मैं ओपी और विशेष समाधानों के रूप में "लाइक" शब्दों में मेल नहीं
खाऊंगा

हाय बेन, कृपया उन अंकों की संख्या से अन्य उत्तरों का उल्लेख न करें। वह बदलने की संभावना है। कृपया उस उत्तर के लेखक के नाम से, या उस उत्तर में प्रयुक्त तकनीक का वर्णन करते हुए एक संक्षिप्त वाक्यांश द्वारा अन्य उत्तर का संदर्भ देते हुए अपने उत्तर को अपडेट करें।
फोनेटैगर

हाय फोन टैगर, कि तीन साल पहले एक उपयोगी टिप्पणी होगी जब मैंने मूल पोस्ट लिखी थी, हालांकि जैसा कि आप उल्लेख करते हैं कि सभी मान बदल गए हैं। मुझे अब याद नहीं है कि मैं किस पद का उल्लेख कर रहा था, और मैं आज उन बिंदुओं द्वारा उनका उल्लेख नहीं करूंगा। फिर भी धन्यवाद।
बेन पर्सिक

मैंने चारों ओर देखा और मुझे विश्वास है कि मैं paxdiablo की बात कर रहा था, इसलिए मैंने यह दिखाने के लिए पाठ में संशोधन किया है।
बेन पर्सिक

10

यदि आप उपस्थिति का पता लगा रहे हैं, तो यहां सबसे आसान उपाय है:

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

यह बूलियन चर में विंडोज़ कमांड के आउटपुट को छोड़ने के लिए बहुत अच्छा काम करता है। आप जिस आदेश को चलाना चाहते हैं, उसके साथ प्रतिध्वनि बदलें। आप पाइप का उपयोग करके एक बयान को और अधिक योग्य बनाने के लिए फाइंडस्ट्रा के एक साथ स्ट्रिंग कर सकते हैं। सेवा नियंत्रण के लिए उदा (SC.exe)

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

यह एक विंडोज़ अपडेट सेवाओं के लिए एससी क्वेरी के आउटपुट का मूल्यांकन करता है, जो एक बहु-पाठ के रूप में सामने आता है, "स्टेट" वाली लाइन को ढूंढता है, फिर पाता है कि क्या शब्द "रनिंग" उस लाइन पर होता है, और तदनुसार त्रुटिवली सेट करता है।


6
आपके पास अपना IF स्टेटमेंट बैकवर्ड है .. 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 कारण है भले ही @Leptonator उल्टे तर्क के साथ सही हो। यह एक सरल और उपयोग में आसान उपाय है।
लेरीक्स डेसीडुआ

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

सवाल में आप एसईटी का उपयोग करके लिंक एक विशिष्ट और अनूठी आवश्यकता को हल कर रहे हैं, इसलिए "एसईटी" का उल्लेख करना महत्वपूर्ण है। हालाँकि, यह वर्तमान चर्चा में कुछ भी जोड़ने के लिए प्रकट नहीं होता है, क्योंकि FIND कमांड को कमांड देने और परिणाम का परीक्षण करने की विधि पहले ही प्रदान की गई है
बेन पर्सिक


0

एक विकल्प के लिए एक फ़ाइल की खोज करने वाले समाधान भी एक स्ट्रिंग खोज सकते हैं , जैसे। findया findstr
आपके मामले में, आसान समाधान यह होगा कि आप एक फ़ाइल नाम जैसे की आपूर्ति के बजाय कमांड में एक स्ट्रिंग को पाइप करें।

मामले के प्रति संवेदनशील स्ट्रिंग:
echo "abcdefg" | find "bcd"

स्ट्रिंग के मामले को अनदेखा करें:
echo "abcdefg" | find /I "bcd"

यदि कोई मैच नहीं मिला, तो आपको CMD और खाली ERRORLEVEL% 1 पर एक रिक्त पंक्ति प्रतिसाद मिलेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.