배치 파일 : 하위 문자열이 문자열이 아닌 파일인지 확인하십시오.


208

배치 파일에는 string이 abcdefg있습니다. bcd문자열 에 있는지 확인하고 싶습니다 .

불행히도 찾은 모든 솔루션 은 하위 문자열의 문자열이 아닌 하위 문자열 의 파일 을 검색합니다 .

이것에 대한 쉬운 해결책이 있습니까?


5
BTW,이 중 보통의 Windowscmd 또는 그것입니다 ms-dos. MSDOS는 오랫동안 Windows의 일부가 아니 었 습니다.
paxdiablo

답변:


288

예, 대체를 사용하고 원래 문자열을 확인할 수 있습니다.

if not x%str1:bcd=%==x%str1% echo It contains bcd

%str1:bcd=%비트는 대체됩니다 bcdstr1원본과는 다른 만드는, 빈 문자열.

원본에 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
FOR 루프에서 문자열 교체를 수행하는 방법을 찾고 있다면 : stackoverflow.com/a/6310580/623622
Czarek Tomczak

60
이것은 훌륭하지만 검색 값이 상수 (예 : bcd)가 아니라 변수 일 때 작동하도록 노력했습니다. 많은 시간 후 나는 마침내 그것을 알아 냈습니다. , searchVal가 선언 된 가정! "X STR1 % searchVal % =!"== "X % 인 str1 %"
게리 BRUNTON

7
@Gary, 이것은이 질문의 요구 사항 중 하나가 아니기 때문에, 다른 질문을했을 것입니다. 기꺼이 도와 줄 사람이 없습니다. 사실, 당신은 여전히 ​​그 질문을하고 스스로 알아서 답해야합니다 (이제 알아 차 렸습니다). 그러면 미래의 검색 자들에게 유용 할 것입니다. 자기 응답은 허용되는 것으로 간주됩니다.
paxdiablo

6
매우 좋은 솔루션이지만 큰 따옴표로 묶어야합니다. 그렇지 않으면 값에 공백이있는 변수와 함께 작동하지 않습니다. 예 : "x % str1 : bcd = %"== "x % str1 %"echo It bcd 포함
Helge Klein

4
" '= str1이 시점에서 예상치 못한"
Berit Larsen

104

소스 문자열을 파이프하고 findstr값을 확인 ERRORLEVEL하여 패턴 문자열이 있는지 확인할 수 있습니다. 값이 0이면 성공을 나타내며 패턴을 찾았습니다. 예를 들면 다음과 같습니다.

::
: 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

이것이 최선의 방법인지 모르겠습니다.


파일 이름을 재귀 적으로 찾고 비교해야했습니다. 이것은 나를 위해 일한 유일한 솔루션이었습니다! 매우 편리하고 매우 간단합니다.
SirJames 17

24

호환성과 사용 편의성을 위해 FIND를 사용하는 것이 좋습니다.

대소 문자를 구분하거나 대소 문자를 구분하지 않는지도 고려해야합니다.

78 포인트가있는 방법 (나는 paxdiablo의 게시물을 언급했다고 생각합니다)은 대소 문자를 구분하기 때문에 일치시킬 수있는 모든 반복에 대해 모든 사례 변형을 별도로 확인해야합니다.

(이 얼마나 아파요! 확인을 위해 9 가지 시험을 의미하는 3 글자 만!)

또한 명령 출력, 루프의 변수 또는 배치 / 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대소 문자를 구분 비교를 할 수 있습니다.
cychoi

1
"IF"비교를 위해 문자를 분리해야하기 때문에 실제로는 옵션이 아닙니다. IF 내가 찾고있는에 대답 영업 이익과 특정 솔루션 등의 "좋아요"조건에 일치하지 않습니다.
벤 Personick에게

안녕 벤, 그들이 가진 포인트 수로 다른 답변을 참조하지 마십시오. 변경 될 가능성이 있습니다. 해당 답변의 작성자 이름 또는 해당 답변에 사용 된 기술을 설명하는 간단한 문구로 다른 답변을 참조하여 답변을 업데이트하십시오.
phonetagger

안녕하세요 전화 Tagger, 3 년 전 원래 게시물을 쓸 때 유용한 의견 이었지만 포인트 값이 모두 변경되었음을 언급했습니다. 더 이상 내가 언급 한 게시물을 기억하지 못하며 오늘 포인트 값으로 언급하지 않을 것입니다. 어쨌든 고마워
벤 Personick 17

나는 주변을 둘러 보았고 나는 paxdiablo를 언급하고 있다고 생각하므로 그것을 보여주기 위해 텍스트를 수정했습니다.
벤 Personick 17

10

존재 여부를 감지하는 경우 가장 쉬운 해결책은 다음과 같습니다.

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

이것은 Windows 명령의 출력을 부울 변수에 드롭하는 데 효과적입니다. echo를 실행하려는 명령으로 바꾸십시오. 파이프를 사용하여 명령문을 추가로 규정하기 위해 Findstr을 함께 묶을 수도 있습니다. 서비스 제어를위한 EG (SC.exe)

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

여러 줄 텍스트로 나오는 Windows Update 서비스에 대한 SC Query의 SC Query 출력을 평가하고 "state"가 포함 된 줄을 찾은 다음 "running"이라는 단어가 해당 줄에 있는지 확인한 다음 그에 따라 오류 수준을 설정합니다.


6
당신은 IF Statement Backward를 가지고 있습니다. 효과가있다. 당신이 가진 방식은 그렇지 않습니다. SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
Leptonator 2019

2
@Leptonator가 반전 된 논리에 맞더라도 +1이됩니다. 이것은 간단하고 사용하기 쉬운 솔루션입니다.
Laryx Decidua

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

SET를 사용하여 연결하는 질문에서 구체적이고 고유 한 요구를 해결하므로 "SET"을 언급하는 것이 중요합니다. 그러나 FIND 명령에 명령을 파이핑하고 결과를 테스트하는 방법이 이미 제공되어 있으므로 현재 토론에 아무 것도 추가하지 않는 것 같습니다.
Ben Personick


0

파일 에서 하위 문자열 을 검색하는 솔루션은 예를 들어 문자열을 검색 할 수도 있습니다 . find또는 findstr.
귀하의 경우 쉬운 해결책 은 파일 이름을 제공하는 대신 문자열을 명령에 파이프하는 것입니다.

대소 문자 구분 문자열 :
echo "abcdefg" | find "bcd"

문자열의 대소 문자를 무시하십시오.
echo "abcdefg" | find /I "bcd"

일치하는 항목이 없으면 CMD 및 % ERRORLEVEL %에서 빈 줄 응답이 1로 설정됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.