abcdefg
ในแฟ้มชุดที่ฉันมีสตริง ฉันต้องการตรวจสอบว่าbcd
อยู่ในสตริงหรือไม่
น่าเสียดายที่ดูเหมือนว่าโซลูชันทั้งหมดที่ฉันค้นหาค้นหาไฟล์สำหรับสตริงย่อยไม่ใช่สตริงสำหรับสตริงย่อย
มีวิธีแก้ปัญหาง่าย ๆ สำหรับเรื่องนี้หรือไม่?
abcdefg
ในแฟ้มชุดที่ฉันมีสตริง ฉันต้องการตรวจสอบว่าbcd
อยู่ในสตริงหรือไม่
น่าเสียดายที่ดูเหมือนว่าโซลูชันทั้งหมดที่ฉันค้นหาค้นหาไฟล์สำหรับสตริงย่อยไม่ใช่สตริงสำหรับสตริงย่อย
มีวิธีแก้ปัญหาง่าย ๆ สำหรับเรื่องนี้หรือไม่?
คำตอบ:
ใช่คุณสามารถใช้การแทนที่และตรวจสอบกับสตริงเดิม:
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
ทำงานโอเค นอกจากนี้ยังป้องกันอักขระเริ่มต้น "ไม่เหมาะสม" บางตัวคุณสามารถไพพ์สตริงต้นทาง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
ฉันมักจะทำสิ่งนี้:
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
ฉันไม่รู้ว่านี่เป็นวิธีที่ดีที่สุดหรือไม่
เพื่อความเข้ากันได้และใช้งานง่ายมักจะดีกว่าที่จะใช้ FIND เพื่อทำสิ่งนี้
คุณต้องพิจารณาด้วยว่าคุณต้องการจับคู่ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กหรือไม่
วิธีที่มี 78 คะแนน (ฉันเชื่อว่าฉันหมายถึงโพสต์ของ paxdiablo) จะจับคู่ Case Sensitively เท่านั้นดังนั้นคุณต้องทำการตรวจสอบแยกต่างหากสำหรับทุกรูปแบบของการวนซ้ำสำหรับการวนซ้ำที่เป็นไปได้ที่คุณอาจต้องการจับคู่
(ช่างเป็นความเจ็บปวด! มีเพียง 3 ตัวอักษรที่หมายถึงการทดสอบที่แตกต่างกัน 9 แบบเพื่อให้การตรวจสอบสำเร็จ!)
นอกจากนี้หลายครั้งที่เหมาะสมกว่าที่จะจับคู่เอาต์พุตคำสั่งตัวแปรในลูปหรือค่าของตัวแปรพอยน์เตอร์ในแบตช์ / CMD ของคุณซึ่งไม่ได้ตรงไปข้างหน้า
ด้วยเหตุผลเหล่านี้นี่เป็นวิธีการทางเลือกที่นิยมกว่า:
ใช้: ค้นหา [/ 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
ทำการเปรียบเทียบ case insensitive
หากคุณกำลังตรวจหาว่ามีอยู่นี่เป็นวิธีที่ง่ายที่สุด:
SET STRING=F00BAH
SET SUBSTRING=F00
ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE)
วิธีนี้ใช้งานได้ดีสำหรับการวางเอาต์พุตของคำสั่ง windows ลงในตัวแปรบูลีน เพียงแค่แทนที่เสียงสะท้อนด้วยคำสั่งที่คุณต้องการเรียกใช้ นอกจากนี้คุณยังสามารถสตริง Findstr เข้าด้วยกันเพื่อให้มีคุณสมบัติของคำสั่งเพิ่มเติมโดยใช้ไพพ์ EG สำหรับบริการควบคุม (SC.exe)
SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE)
ที่หนึ่งประเมินผลลัพธ์ของ SC Query สำหรับบริการอัพเดท windows ซึ่งออกมาเป็นข้อความหลายบรรทัดค้นหาบรรทัดที่มี "สถานะ" จากนั้นค้นหาว่าคำว่า "ทำงาน" เกิดขึ้นบนบรรทัดนั้นและตั้งข้อผิดพลาดตามระดับ
SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
ฉันอาจจะสายเกินไปกับคำตอบนี้ แต่คำตอบที่ได้รับการยอมรับนั้นใช้สำหรับตรวจสอบว่า "สตริงที่เข้ารหัสยาก" เป็นส่วนหนึ่งของสตริงการค้นหาหรือไม่
สำหรับการค้นหาแบบไดนามิกคุณจะต้องทำสิ่งนี้:
SET searchString=abcd1234
SET key=cd123
CALL SET keyRemoved=%%searchString:%key%=%%
IF NOT "x%keyRemoved%"=="x%searchString%" (
ECHO Contains.
)
หมายเหตุ: คุณสามารถรับตัวแปรทั้งสองเป็นอาร์กิวเมนต์
คำตอบที่ดีกว่าอยู่ที่นี่ :
set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
โซลูชันที่ค้นหาไฟล์สำหรับสตริงย่อยสามารถค้นหาสตริงได้เช่น หรือfind
ในกรณีของคุณทางออกที่ง่ายfindstr
คือการไพพ์สตริงลงในคำสั่งแทนที่จะใส่ชื่อไฟล์เช่น
สตริงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่:
echo "abcdefg" | find "bcd"
ละเว้นกรณีของสตริง:
echo "abcdefg" | find /I "bcd"
หากไม่พบข้อมูลที่ตรงกันคุณจะได้รับการตอบกลับของบรรทัดว่างในชุด CMD และ% ERRORLEVEL% เป็น 1
Windows
และcmd
หรือms-dos
มันเป็น MSDOS ไม่ได้เป็นส่วนหนึ่งของ Windows มาเป็นเวลานาน