如何检测输入是否为报价?
我有以下代码如何检测输入是否为报价?
if "%userInput%"==""" (
do_something
)
我想它来检测是否是报价("
)。但是,此代码会引发错误。
如何检测输入是否为是的报价?
这是一个没有延迟扩展的解决方案,可以处理任何输入,包括空格和毒药字符。我的测试代码处于循环状态。当您准备退出时,只需按下<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替代解决方案,不需要延迟扩展。他以不同的方式解释了这个问题,回答了问题“输入值是否包含引号内的任何引号?”,并使用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
...并可能不延迟扩展:
@Echo Off
Set/P "input=Please input a character: "
If [^%input%]==[^"] (Echo it is a quote) Else Echo it is something else
Timeout -1
,你问: “如果输入包含报价”。只是find
它:
set "i=hello " world"
set i|find """" >nul && echo yes || echo no
注:echo %i%|find """"
可能无法与配对的报价工作,但set
并不关心。
注意""""
语法(看起来很奇怪并且不直观)。 find
似乎没有使用通常的转义:find "^""
给出语法错误。
''“”“'语法真的很奇怪。但根据[这里](http://www.robvanderwoude.com/escapechars.php),'find'确实使用了不常用的转义方式。 – SteveFest
+1您的解释是“包含报价”的最常见解释。但是后来OP在询问“如何检测输入是否是报价?”,这是完全不同的。 FIND无法确定输入是否与报价完全匹配,但FINDSTR可以。见[我的回答](https://*.com/a/46248877/1012053) – dbenham
@dbenham @Stephan也许我的帖子“包含”两个不同的问题。我应该将“包含报价”改为“是报价”吗? – SteveFest
当我删除'if not defined'语句时,脚本仍然退出,当我什么都没输入,并且抛出语法错误。 – SteveFest
是的,如果变量未定义,你不能执行我的IF比较,因为'“%undefinedVar:”=“”%“'扩展为'”“=”“”' – dbenham
这种预防措施的工作原理是:将'var'设置为某些一些未使用的字符串,所以它应该比较该字符串,而不是空的用户输入。 – SteveFest