programing

배치 파일:하위 문자열이 (파일이 아닌) 문자열에 있는지 확인합니다.

javamemo 2023. 5. 15. 20:58
반응형

배치 파일:하위 문자열이 (파일이 아닌) 문자열에 있는지 확인합니다.

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

안타깝게도 제가 찾은 모든 솔루션은 하위 문자열이 아닌 하위 문자열 파일을 검색하는 것 같습니다.

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

예, 치환을 사용하여 원래 문자열을 확인할 수 있습니다.

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

%str1:bcd=%비트가 a를 대체할 것입니다.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잘 작동합니다.또한 특정 "잘못된" 시작 문자로부터 보호합니다.

소스 문자열을 연결할 수 있습니다.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

저는 주로 다음과 같은 일을 합니다.

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점의 방법(팍스 디아블로의 게시물을 참조한 것으로 생각됨)은 대소문자만 일치하므로 일치시킬 수 있는 모든 반복에 대해 모든 대소문자 변형을 별도로 확인해야 합니다.

(참 고통스럽군요!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.

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

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

이것은 Windows 명령의 출력을 부울 변수로 삭제하는 데 유용합니다.에코를 실행할 명령으로 바꾸기만 하면 됩니다.파이프를 사용하여 Findstr의 문자열을 함께 사용하여 문을 더욱 한정할 수도 있습니다.서비스 제어(SC.exe)용 E.G

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

여러 줄 텍스트로 표시되는 Windows 업데이트 서비스에 대한 SC 쿼리의 출력을 평가하고, "상태"가 포함된 줄을 찾은 다음 해당 줄에서 "실행 중"이라는 단어가 발생하는지 여부를 확인하고, 그에 따라 오류 수준을 설정합니다.

제가 이 답변에 대해 너무 늦게 답변을 드리겠지만, 수락된 답변은 "하드 코딩된 문자열"이 검색 문자열의 일부인지 확인하는 경우에만 작동합니다.

동적 검색의 경우 다음 작업을 수행해야 합니다.

SET searchString=abcd1234
SET key=cd123

CALL SET keyRemoved=%%searchString:%key%=%%

IF NOT "x%keyRemoved%"=="x%searchString%" (
    ECHO Contains.
)

참고: 두 변수를 인수로 사용할 수 있습니다.

변수에서 텍스트를 찾는 방법, 예:

var_text="demo string test"
Echo.%var_text% | findstr /C:"test">nul && (
    echo "found test" 
    ) || Echo.%var_text% | findstr /C:"String">nul && (
             echo "found String with S uppercase letter" 
    ) || (
             echo "Not Found " 
    )

범례:

  1. & and _this _that and this _this _this _this
  2. ||: 실행됩니다.
  3. &&를 실행합니다. : IF_SUCCESSFUL이 됩니다.
  4. >nul of command
  5. findstr
  6. /C: 검색 합니다.

저에게 가장 좋은 방법은 다음과 같습니다.

call :findInString "HelloWorld" "World"

:findInString
ECHO.%1 | FIND /I %2>Nul && ( 
  Echo.Found
) || (
  Echo.Not found
)
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)

더 나은 답변은 다음과 같습니다.

set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains

파일에서 하위 문자열을 검색하는 솔루션은 문자열을 검색할 수도 있습니다. find또는findstr.
경우 간단한 해결책은 파일 이름을 제공하는 대신 명령어에 문자열을 연결하는 것입니다.

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

문자열 대소문자 무시:
echo "abcdefg" | find /I "bcd"

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

@user839791의 답변을 기반으로 구축되었지만, 몇 가지를 더 추가했습니다.

@echo off
rem --Set variable below--
set var=condition

rem --Uncomment below line to display contents of variable--
::echo The variable is %var%

rem --Change condition to desired string below--
ECHO.%var%| FIND /I "condition">Nul && (  
  rem --Occurs if the string is found--
  Echo.Variable is "condition"
  color C
  pause
) || (
  rem --Occurs if the string isn't found--
  Echo.Variable is not "condition"
  color A
  pause
)

예, 문자열에서 하위 문자열을 찾을 수 있습니다.

echo.%data% | FINDSTR /I "POS">Nul && (SET var=POS) || (SET noVar="variable not found")

echo.%data% | FINDSTR /I "TD1">Nul && (SET var=TD1) || (SET noVar="variable not found")

GOTO %var%

:POS   
echo processes inside POS  
GOTO END

:TD1   
echo processes inside TD1

:END

언급URL : https://stackoverflow.com/questions/7005951/batch-file-find-if-substring-is-in-string-not-in-a-file

반응형