Risposte:
Sì, è possibile utilizzare le sostituzioni e verificare la stringa originale:
if not x%str1:bcd=%==x%str1% echo It contains bcd
Il %str1:bcd=%
bit sostituirà un bcd
in str1
con una stringa vuota, rendendolo diverso dall'originale.
Se l'originale non conteneva una bcd
stringa, la versione modificata sarà identica.
Il test con il seguente script lo mostrerà in azione:
@setlocal enableextensions enabledelayedexpansion
@echo off
set str1=%1
if not x%str1:bcd=%==x%str1% echo It contains bcd
endlocal
E i risultati di varie corse:
c:\testarea> testprog hello
c:\testarea> testprog abcdef
It contains bcd
c:\testarea> testprog bcd
It contains bcd
Un paio di note:
if
dichiarazione è la carne di questa soluzione, tutto il resto è roba di supporto.x
anteriore dei due lati dell'uguaglianza è assicurarsi che la stringa bcd
funzioni correttamente. Protegge anche da alcuni personaggi iniziali "impropri".È possibile reindirizzare la stringa di origine findstr
e verificare il valore di ERRORLEVEL
per vedere se la stringa del modello è stata trovata. Un valore pari a zero indica il successo e il modello è stato trovato. Ecco un esempio:
::
: 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
)
Quando questo viene eseguito in CMD.EXE, otteniamo:
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
Di solito faccio qualcosa del genere:
Echo.%1 | findstr /C:"%2">nul && (
REM TRUE
) || (
REM FALSE
)
Esempio:
Echo.Hello world | findstr /C:"world">nul && (
Echo.TRUE
) || (
Echo.FALSE
)
Echo.Hello world | findstr /C:"World">nul && (Echo.TRUE) || (Echo.FALSE)
Produzione:
TRUE
FALSE
Non so se questo è il modo migliore.
Per compatibilità e facilità d'uso è spesso meglio usare FIND per farlo.
È inoltre necessario considerare se si desidera abbinare il caso in modo sensibile o caso insensibile.
Il metodo con 78 punti (credo che mi riferissi al post di paxdiablo) corrisponderà solo a Case Sensitively, quindi devi mettere un controllo separato per ogni variazione del caso per ogni possibile iterazione che potresti voler abbinare.
(Che dolore! Solo 3 lettere significa 9 test diversi per completare il controllo!)
Inoltre, molte volte è preferibile abbinare l'output del comando, una variabile in un ciclo o il valore di una variabile puntatore nel batch / CMD che non è così semplice.
Per questi motivi questa è una metodologia alternativa preferibile:
Usa: Trova [/ I] [/ V] "Personaggi da abbinare"
[/ I] (senza distinzione tra maiuscole e minuscole) [/ V] (NON deve contenere i caratteri)
Come linea singola:
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"
)
Come accennato, questo è ottimo per le cose che non sono in variabili che consentono anche la sostituzione di stringhe:
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
quindi IF /I
per eseguire confronti senza distinzione tra maiuscole e minuscole.
Se stai rilevando la presenza, ecco la soluzione più semplice:
SET STRING=F00BAH
SET SUBSTRING=F00
ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE)
Funziona perfettamente per eliminare l'output dei comandi di Windows in una variabile booleana. Basta sostituire l'eco con il comando che si desidera eseguire. Puoi anche mettere insieme le stringhe di Findstr per qualificare ulteriormente un'istruzione usando le pipe. EG per Service Control (SC.exe)
SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE)
Quello valuta l'output di SC Query per i servizi di aggiornamento di Windows che esce come un testo multilinea, trova la riga contenente "stato", quindi trova se la parola "in esecuzione" appare su quella linea e imposta il livello di errore di conseguenza.
SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
Probabilmente sto arrivando un po 'troppo tardi con questa risposta, ma la risposta accettata funziona solo per verificare se una "stringa codificata" fa parte della stringa di ricerca.
Per la ricerca dinamica, dovresti fare questo:
SET searchString=abcd1234
SET key=cd123
CALL SET keyRemoved=%%searchString:%key%=%%
IF NOT "x%keyRemoved%"=="x%searchString%" (
ECHO Contains.
)
Nota: è possibile prendere le due variabili come argomenti.
La risposta migliore era qui :
set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
Le soluzioni che cercano un file per una sottostringa possono anche cercare una stringa , ad es. find
ofindstr
.
Nel tuo caso, la soluzione semplice sarebbe quella di inserire una stringa nel comando invece di fornire un nome file ad es.
stringa sensibile al maiuscolo / minuscolo:
echo "abcdefg" | find "bcd"
ignora il caso della stringa:
echo "abcdefg" | find /I "bcd"
Se non viene trovata alcuna corrispondenza, otterrai una risposta in linea vuota su CMD e% ERRORLEVEL% impostato su 1
Windows
ecmd
o èms-dos
. MSDOS non fa parte di Windows da molto tempo.