Jawaban:
Ya, Anda dapat menggunakan substitusi dan memeriksa string asli:
if not x%str1:bcd=%==x%str1% echo It contains bcd
The %str1:bcd=%
bit akan mengganti bcd
dalam str1
dengan string kosong, sehingga berbeda dari aslinya.
Jika aslinya tidak mengandung bcd
string di dalamnya, versi yang diubah akan identik.
Pengujian dengan skrip berikut akan menunjukkannya dalam tindakan:
@setlocal enableextensions enabledelayedexpansion
@echo off
set str1=%1
if not x%str1:bcd=%==x%str1% echo It contains bcd
endlocal
Dan hasil dari berbagai proses:
c:\testarea> testprog hello
c:\testarea> testprog abcdef
It contains bcd
c:\testarea> testprog bcd
It contains bcd
Beberapa catatan:
if
pernyataan adalah daging dari solusi ini, segala sesuatu yang lain adalah dukungan hal.x
sebelum kedua belah pihak kesetaraan ini adalah untuk memastikan bahwa string bcd
bekerja baik-baik saja. Ini juga melindungi terhadap karakter awal "tidak patut" tertentu.Anda dapat menyalurkan string sumber ke findstr
dan memeriksa nilai ERRORLEVEL
untuk melihat apakah string pola ditemukan. Nilai nol menunjukkan keberhasilan dan pola ditemukan. Berikut ini sebuah contoh:
::
: 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
)
Ketika ini dijalankan di CMD.EXE, kita mendapatkan:
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
Saya biasanya melakukan sesuatu seperti ini:
Echo.%1 | findstr /C:"%2">nul && (
REM TRUE
) || (
REM FALSE
)
Contoh:
Echo.Hello world | findstr /C:"world">nul && (
Echo.TRUE
) || (
Echo.FALSE
)
Echo.Hello world | findstr /C:"World">nul && (Echo.TRUE) || (Echo.FALSE)
Keluaran:
TRUE
FALSE
Saya tidak tahu apakah ini cara terbaik.
Untuk kompatibilitas dan kemudahan penggunaan, sering kali lebih baik menggunakan FIND untuk melakukan ini.
Anda juga harus mempertimbangkan apakah Anda ingin mencocokkan case sensitif atau case sensitif.
Metode dengan 78 poin (saya yakin saya merujuk pada posting paxdiablo) hanya akan cocok dengan Case Sensitive, jadi Anda harus meletakkan cek terpisah untuk setiap variasi kasus untuk setiap kemungkinan iterasi yang mungkin ingin Anda cocokkan.
(Betapa merepotkan! Hanya 3 huruf yang berarti 9 tes berbeda untuk menyelesaikan cek!)
Selain itu, sering kali lebih baik untuk mencocokkan output perintah, variabel dalam satu lingkaran, atau nilai variabel pointer di batch / CMD Anda yang tidak lurus ke depan.
Untuk alasan ini, ini adalah metodologi alternatif yang lebih disukai:
Gunakan: Temukan [/ I] [/ V] "Karakter yang Cocok"
[/ I] (Huruf peka) [/ V] (TIDAK boleh mengandung karakter)
Sebagai Baris Tunggal:
ECHO.%Variable% | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
Multi-line:
ECHO.%Variable%| FIND /I "ABC">Nul && (
Echo.Found "ABC"
) || (
Echo.Did not find "ABC"
)
Seperti yang disebutkan ini bagus untuk hal-hal yang tidak ada dalam variabel yang memungkinkan penggantian string juga:
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
kemudian IF /I
untuk melakukan perbandingan kasus sensitif.
Jika Anda mendeteksi keberadaan, berikut adalah solusi termudah:
SET STRING=F00BAH
SET SUBSTRING=F00
ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE)
Ini berfungsi baik untuk menjatuhkan output perintah windows ke dalam variabel boolean. Ganti gema dengan perintah yang ingin Anda jalankan. Anda juga dapat merangkai Findstr bersama untuk lebih lanjut memenuhi syarat pernyataan menggunakan pipa. EG untuk Kontrol Layanan (SC.exe)
SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE)
Yang satu mengevaluasi output dari SC Query untuk layanan pembaruan windows yang keluar sebagai teks multiline, menemukan baris yang berisi "status" kemudian menemukan jika kata "running" muncul pada baris itu, dan mengatur tingkat kesalahan sesuai.
SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
Saya mungkin datang agak terlambat dengan jawaban ini, tetapi jawaban yang diterima hanya berfungsi untuk memeriksa apakah "hard-coded string" adalah bagian dari string pencarian.
Untuk pencarian dinamis, Anda harus melakukan ini:
SET searchString=abcd1234
SET key=cd123
CALL SET keyRemoved=%%searchString:%key%=%%
IF NOT "x%keyRemoved%"=="x%searchString%" (
ECHO Contains.
)
Catatan: Anda bisa menggunakan dua variabel sebagai argumen.
Jawaban yang lebih baik ada di sini :
set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
Solusi yang mencari file untuk substring juga dapat mencari string , misalnya. find
atau findstr
.
Dalam kasus Anda, solusi mudahnya adalah menyalurkan string ke dalam perintah alih-alih memberikan nama file misalnya.
string case-sensitive:
echo "abcdefg" | find "bcd"
abaikan case string:
echo "abcdefg" | find /I "bcd"
JIKA tidak ditemukan kecocokan, Anda akan mendapatkan respons baris kosong pada CMD dan% ERRORLEVEL% ditetapkan ke 1
Windows
dancmd
atau itums-dos
. MSDOS belum bagian dari Windows untuk lama waktu.