2017-09-15 33 views

回答

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替代解决方案,不需要延迟扩展。他以不同的方式解释了这个问题,回答了问题“输入值是否包含引号内的任何引号?”,并使用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 
+0

当我删除'if not defined'语句时,脚本仍然退出,当我什么都没输入,并且抛出语法错误。 – SteveFest

+0

是的,如果变量未定义,你不能执行我的IF比较,因为'“%undefinedVar:”=“”%“'扩展为'”“=”“”' – dbenham

+0

这种预防措施的工作原理是:将'var'设置为某些一些未使用的字符串,所以它应该比较该字符串,而不是空的用户输入。 – SteveFest

3

额外的变量和延迟扩展:

@echo off 

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

if !quote! equ !test_quote! echo equal 
+0

啊!我几乎在所有脚本中使用它时,我怎么忘记了延迟扩展:/ – SteveFest

+2

不需要第二个变量:'if!quote! equ ^“echo equal' – dbenham

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 
+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),'find'确实使用了不常用的转义方式。 – SteveFest

+0

+1您的解释是“包含报价”的最常见解释。但是后来OP在询问“如何检测输入是否是报价?”,这是完全不同的。 FIND无法确定输入是否与报价完全匹配,但FINDSTR可以。见[我的回答](https://stackoverflow.com/a/46248877/1012053) – dbenham

+0

@dbenham @Stephan也许我的帖子“包含”两个不同的问题。我应该将“包含报价”改为“是报价”吗? – SteveFest