如何检测输入是否引用?

时间:2017-09-15 11:40:18

标签: batch-file if-statement cmd special-characters

我有以下代码

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

我希望检测%userInput% 是否为引用(")。但是,此代码会引发错误。

如何检测输入引用?

4 个答案:

答案 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