Câu trả lời:
Có, bạn có thể sử dụng thay thế và kiểm tra đối với chuỗi ban đầu:
if not x%str1:bcd=%==x%str1% echo It contains bcd
Các %str1:bcd=%
bit sẽ thay thế một bcd
trong str1
với một chuỗi rỗng, làm cho nó khác biệt so với bản gốc.
Nếu bản gốc không chứa một bcd
chuỗi trong đó, phiên bản sửa đổi sẽ giống hệt nhau.
Thử nghiệm với đoạn script sau sẽ hiển thị nó trong hành động:
@setlocal enableextensions enabledelayedexpansion
@echo off
set str1=%1
if not x%str1:bcd=%==x%str1% echo It contains bcd
endlocal
Và kết quả của các lần chạy khác nhau:
c:\testarea> testprog hello
c:\testarea> testprog abcdef
It contains bcd
c:\testarea> testprog bcd
It contains bcd
Một vài lưu ý:
if
tuyên bố là thịt của giải pháp này, mọi thứ khác là hỗ trợ các công cụ.x
trước khi hai bên của bình đẳng là để đảm bảo rằng các chuỗi bcd
công trình okay. Nó cũng bảo vệ chống lại một số nhân vật bắt đầu "không đúng".Bạn có thể đặt chuỗi nguồn vào findstr
và kiểm tra giá trị của ERRORLEVEL
để xem chuỗi mẫu có được tìm thấy không. Giá trị bằng 0 biểu thị thành công và mô hình đã được tìm thấy. Đây là một ví dụ:
::
: 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
)
Khi điều này được chạy trong CMD.EXE, chúng tôi nhận được:
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
Tôi thường làm một cái gì đó như thế này:
Echo.%1 | findstr /C:"%2">nul && (
REM TRUE
) || (
REM FALSE
)
Thí dụ:
Echo.Hello world | findstr /C:"world">nul && (
Echo.TRUE
) || (
Echo.FALSE
)
Echo.Hello world | findstr /C:"World">nul && (Echo.TRUE) || (Echo.FALSE)
Đầu ra:
TRUE
FALSE
Tôi không biết nếu đây là cách tốt nhất.
Để tương thích và dễ sử dụng, tốt hơn hết là sử dụng TÌM để làm điều này.
Bạn cũng phải xem xét nếu bạn muốn khớp trường hợp nhạy cảm hoặc trường hợp không nhạy cảm.
Phương pháp với 78 điểm (tôi tin rằng tôi đã đề cập đến bài đăng của paxdiablo) sẽ chỉ khớp với Case Sensitively, do đó bạn phải đặt một kiểm tra riêng cho mọi biến thể trường hợp cho mỗi lần lặp có thể bạn muốn khớp.
(Thật là đau! Chỉ có 3 chữ cái có nghĩa là 9 bài kiểm tra khác nhau để hoàn thành kiểm tra!)
Ngoài ra, nhiều lần nên kết hợp đầu ra lệnh, biến trong vòng lặp hoặc giá trị của biến con trỏ trong lô / CMD của bạn không đơn giản như trước.
Vì những lý do này, đây là một phương pháp thay thế thích hợp hơn:
Sử dụng: Tìm [/ I] [/ V] "Nhân vật phù hợp"
[/ I] (Không phân biệt chữ hoa chữ thường) [/ V] (KHÔNG được chứa các ký tự)
Như một dòng:
ECHO.%Variable% | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
Đa dòng:
ECHO.%Variable%| FIND /I "ABC">Nul && (
Echo.Found "ABC"
) || (
Echo.Did not find "ABC"
)
Như đã đề cập, điều này rất tốt cho những thứ không có trong biến cũng cho phép thay thế chuỗi:
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
sau đó IF /I
để so sánh trường hợp không nhạy cảm.
Nếu bạn đang phát hiện sự hiện diện, đây là giải pháp đơn giản nhất:
SET STRING=F00BAH
SET SUBSTRING=F00
ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE)
Điều này hoạt động rất tốt để thả đầu ra của các lệnh windows vào một biến boolean. Chỉ cần thay thế echo bằng lệnh bạn muốn chạy. Bạn cũng có thể xâu chuỗi Findstr lại với nhau để tiếp tục đủ điều kiện tuyên bố bằng cách sử dụng các đường ống. Kiểm soát dịch vụ (SC.exe)
SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE)
Người ta đánh giá đầu ra của SC Query cho các dịch vụ cập nhật windows xuất hiện dưới dạng văn bản nhiều dòng, tìm dòng chứa "trạng thái" sau đó tìm nếu từ "chạy" xảy ra trên dòng đó và đặt lỗi theo đó.
SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
Có lẽ tôi đến hơi muộn với câu trả lời này, nhưng câu trả lời được chấp nhận chỉ hoạt động để kiểm tra xem "chuỗi mã hóa cứng" có phải là một phần của chuỗi tìm kiếm hay không.
Đối với tìm kiếm động, bạn sẽ phải làm điều này:
SET searchString=abcd1234
SET key=cd123
CALL SET keyRemoved=%%searchString:%key%=%%
IF NOT "x%keyRemoved%"=="x%searchString%" (
ECHO Contains.
)
Lưu ý: Bạn có thể lấy hai biến làm đối số.
Câu trả lời tốt hơn đã có ở đây :
set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
Các giải pháp tìm kiếm tệp cho một chuỗi con cũng có thể tìm kiếm một chuỗi , ví dụ. find
hoặc findstr
.
Trong trường hợp của bạn, giải pháp dễ dàng sẽ là nối một chuỗi vào lệnh thay vì cung cấp tên tệp, vd.
chuỗi phân biệt chữ hoa chữ thường:
echo "abcdefg" | find "bcd"
bỏ qua trường hợp của chuỗi:
echo "abcdefg" | find /I "bcd"
NẾU không tìm thấy kết quả khớp, bạn sẽ nhận được phản hồi dòng trống trên CMD và% ERRORLEVEL% được đặt thành 1
Windows
vàcmd
hay đóms-dos
. MSDOS đã không còn là một phần của Windows trong một thời gian dài .