2017-09-15 3 views
2

나는 내가 %userInput% 따옴표 (") 인 경우는 감지하고자하는 다음 코드를입력이 따옴표인지 감지하는 방법은 무엇입니까?

if "%userInput%"==""" (
    do_something 
) 

있습니다. 그러나이 코드는 오류를 발생시킵니다.

입력이 인 경우 어떻게 감지합니까?

@echo off 

set /p quote=Enter quote 
set "test_quote="" 
setlocal enableDelayedExpansion 

if !quote! equ !test_quote! echo equal 

답변

3

여기에는 공백 및 포이즌 문자를 포함한 모든 입력에서 작동해야하는 지연 확장없는 솔루션이 있습니다. 내 테스트 코드가 반복됩니다. 종료 할 준비가되면 아무 것도 입력하지 않고 <Enter>을 누르기 만하면됩니다.

@echo off 
setlocal 

:loop 
set "var=" 
set /p "var=enter a string: " 
if not defined var exit /b 

if "%var:"=""%" == """" echo equals quote 

echo(
goto loop 

트릭이 상당히 분명해야합니다. 확장시 모든 값을 따옴표로 묶고 모든 내부 따옴표를 두 배로하여 모든 토큰 구분 기호와 포이즌 문자를 따옴표로 묶어야합니다. 물론 오른쪽에는 묶는 따옴표와 일치시키려는 두배의 따옴표 (총 4 개)를 포함해야합니다.

IF 테스트를 통해 모든 입력 (값 없음 포함)을 전달할 수 있어야하는 경우 테스트 변수를 정의 할 수 있습니다. 지연 확장을 필요로하지 않습니다 FINDSTR를 사용하여 다른 해결책을 찾기 위해 FINDSTR

내가 Stephan's answer 영감을 얻었다을 사용 (var에 이미 사용자의 입력을 가지고 가정)

set "test=" 
if defined var set "test=%var:"=""%" 
if "%test%" == """" echo equals quote 

대체 솔루션을 다음과 같이 뭔가. 그는 "입력 값에 그 중 어디에 든 견적이 포함되어 있습니까?"라는 질문에 답하면서 다르게 질문을 해석하고 FIND를 사용하여이를 해결했습니다.

그러나 FIND는 입력 내용이 작은 따옴표 문자와 정확하게 일치하는지 확인할 수 없습니다.

FINDSTR이있는 간단한 하나의 라이너로이를 해결할 수 있습니다.FINDSTR는 일반적으로 따옴표를 요구하는

2>nul set var|findstr /x ^"var=\"" >nul && echo equals quote 

또는

2>nul set var|findstr /x "var=\"^" >nul && echo equals quote 

참고 \"로 이스케이프하고, 배치 파서 따옴표의 홀수가 있기 때문에 따옴표 중 하나가 ^"로 이스케이프해야합니다. 따옴표가 이스케이프되지 않은 경우 나머지 줄은 리디렉션 및 조건부 실행 작업 대신 문자열의 일부로 간주됩니다.

일괄 파서를 사용하면 인용이 활성화되면 인용 부호를 이스케이프 처리 할 수 ​​없습니다. 그래서 다음은 작동하지 않습니다.

2>nul set var|findstr /x "var=\^"" >nul && echo equals quote THIS DOES NOT WORK 
+0

'if not defined' 문을 제거하면 아무것도 입력하지 않으면 스크립트가 여전히 종료되고 구문 오류가 발생합니다. – SteveFest

+0

예, ' "% undefinedVar :"= ""% "'는" ""= "" "로 확장되기 때문에 변수가 정의되지 않은 경우 IF 비교를 실행할 수 없습니다 – dbenham

+0

이주의 사항이 작동합니까? 사용되지 않는 문자열의 일종이므로 사용자 입력이 아닌 문자열을 비교해야합니다. – SteveFest

3

은 "입력 가 견적을이 포함 된 경우"

@Echo Off 
Set/P "input=Please input a character: " 
If [^%input%]==[^"] (Echo it is a quote) Else Echo it is something else 
Timeout -1 
+0

Ah! 거의 모든 스크립트에서 사용할 때 지연 확장을 어떻게 잊었습니까?/ – SteveFest

+2

두 번째 변수는 필요 없습니다. 'if! quote! equ^"echo equal' – dbenham

2

... 아마도 지연 확장하지 않고 : 추가 변수 및 지연 확장과

+0

입력 내용에 공백이 있으면 스크립트가 실패합니다. – npocmaka

+0

@Compo 한 번 방법을 고려해 보았지만 공백 문자와 특수 문자가있는 입력에서 실패 할 것임을 알았습니다. * 고양이 고양이는 어디 에나 있습니다. * – SteveFest

+0

질문은 따옴표를 일련의 문자가 아닌 단일 문자로 검사하는 것과 관련하여, 특정 문자를 검사하기 위해'If [^ % input : ~, 1 %] == [^ "]'를 사용할 수 있습니다. 문자가 별도의 'If'에 음식을 장만 할 수있는 공간이지만 질문 범위 밖에있는 경우. 제 대답은 일반적인 강력한 솔루션으로 제공되지 않았습니다. 단지 지연된 확장을 사용하는 것이 유일한 솔루션이 아니라는 것을 보여주는 대안입니다. – Compo

4

묻는 메시지가있다. 그냥 find이 :

set "i=hello " world" 
set i|find """" >nul && echo yes || echo no 

참고 : echo %i%|find """"가 짝 따옴표와 함께 작동하지 않을 수 있습니다,하지만 set 상관하지 않는다.

"""" 구문을 사용합니다 (이상하고 외모가 없습니다). find은 일반적인 이스케이프를 사용하지 않는 것으로 보입니다. find "^""은 구문 오류를 발생시킵니다.

+0

' "" "구문은 정말 이상합니다. 그러나 [여기] (http://www.robvanderwoude.com/escapechars.php)에 따르면, '찾기'는 흔하지 않은 탈출 방법을 사용합니다. – SteveFest

+0

+1 귀하의 해석은 "견적 포함"의 가장 일반적인 해석입니다. 그러나 나중에 OP는 "입력이 인용인지 어떻게 감지합니까?"라고 물었습니다. 이것은 완전히 다른 것입니다. FIND는 입력이 따옴표와 정확히 일치하는지 판단 할 수 없지만 FINDSTR은 일치 할 수 있습니다. 아마도 내 게시물은 두 가지 질문을 포함하고있을 것입니다. [https://stackoverflow.com/a/46248877/1012053] – dbenham

+0

@dbenham @Stephan '견적 포함'을 '견적 포함'으로 변경해야합니까? – SteveFest