我有以下代码
if "%userInput%"==""" (
do_something
)
我希望检测%userInput%
是否为引用("
)。但是,此代码会引发错误。
如何检测输入是引用?
答案 0 :(得分:5)
正如您所说"如果输入包含引用"。只需find
:
set "i=hello " world"
set i|find """" >nul && echo yes || echo no
注意:echo %i%|find """"
可能不适用于不成对的引号,但set
并不关心。
请注意""""
语法(看起来很奇怪且不直观)。 find
似乎没有使用通常的转义:find "^""
会出现语法错误。
答案 1 :(得分:3)
附加变量和延迟扩展:
@echo off
set /p quote=Enter quote
set "test_quote=""
setlocal enableDelayedExpansion
if !quote! equ !test_quote! echo equal
答案 2 :(得分: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测试传递所有输入(包括无值),则可以定义测试变量。类似下面的内容(假设var已经有用户输入)
set "test="
if defined var set "test=%var:"=""%"
if "%test%" == """" echo equals quote
使用FINDSTR的替代解决方案
我受到Stephan's answer的启发,找到了使用FINDSTR的替代解决方案,不需要延迟扩展。他以不同的方式解释了这个问题,回答了问题&#34;输入值是否在其中的任何位置包含引用?&#34;,并使用FIND解决了这个问题。
但是FIND无法确定输入是否与单引号字符完全匹配。
使用FINDSTR的简单单线程可以解决这个问题。
2>nul set var|findstr /x ^"var=\"" >nul && echo equals quote
或
2>nul set var|findstr /x "var=\"^" >nul && echo equals quote
请注意,FINDSTR通常要求将引号转义为\"
,并且批处理解析器要求将其中一个引号转义为^"
,因为引号数为奇数。如果引用未被转义,则该行的其余部分被视为字符串的一部分,而不是重定向和条件执行操作。
另请注意,使用批处理解析器,一旦激活引用,就无法转义引号。所以以下不起作用
2>nul set var|findstr /x "var=\^"" >nul && echo equals quote THIS DOES NOT WORK
答案 3 :(得分:2)
......可能没有延迟扩展:
@Echo Off
Set/P "input=Please input a character: "
If [^%input%]==[^"] (Echo it is a quote) Else Echo it is something else
Timeout -1