여기에는 공백 및 포이즌 문자를 포함한 모든 입력에서 작동해야하는 지연 확장없는 솔루션이 있습니다. 내 테스트 코드가 반복됩니다. 종료 할 준비가되면 아무 것도 입력하지 않고 <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
'if not defined' 문을 제거하면 아무것도 입력하지 않으면 스크립트가 여전히 종료되고 구문 오류가 발생합니다. – SteveFest
예, ' "% undefinedVar :"= ""% "'는" ""= "" "로 확장되기 때문에 변수가 정의되지 않은 경우 IF 비교를 실행할 수 없습니다 – dbenham
이주의 사항이 작동합니까? 사용되지 않는 문자열의 일종이므로 사용자 입력이 아닌 문자열을 비교해야합니다. – SteveFest