development

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

big-blog 2020. 5. 14. 20:48
반응형

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


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

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

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


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

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괜찮 작동합니다. 또한 특정 "부적절한"시작 문자로부터 보호합니다.

소스 문자열을 파이프하고 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를 사용하는 것이 좋습니다.

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

The method with 78 points (I believe I was referring to paxdiablo's post) will only match Case Sensitively, so you must put a separate check for every case variation for every possible iteration you may want to match.

( What a pain! At only 3 letters that means 9 different tests in order to accomplish the check! )

In addition, many times it is preferable to match command output, a variable in a loop, or the value of a pointer variable in your batch/CMD which is not as straight forward.

For these reasons this is a preferable alternative methodology:

Use: Find [/I] [/V] "Characters to Match"

[/I] (case Insensitive) [/V] (Must NOT contain the characters)

As Single Line:

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"
)

As mentioned this is great for things which are not in variables which allow string substitution as well:

FOR %A IN (oihu AljB lojkAbCk) DO ( ECHO.%~A| FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( 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.


If you are detecting for presence, here's the easiest solution:

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

This works great for dropping the output of windows commands into a boolean variable. Just replace the echo with the command you want to run. You can also string Findstr's together to further qualify a statement using pipes. E.G. for Service Control (SC.exe)

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

That one evaluates the output of SC Query for windows update services which comes out as a multiline text, finds the line containing "state" then finds if the word "running" occurs on that line, and sets the errorlevel accordingly.


Better answer was here:

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

I'm probably coming a bit too late with this answer, but the accepted answer only works for checking whether a "hard-coded string" is a part of the search string.

For dynamic search, you would have to do this:

SET searchString=abcd1234
SET key=cd123

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

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

Note: You can take the two variables as arguments.


ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)

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

반응형