Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何检测输入是否为引号?_Batch File_If Statement_Cmd_Special Characters - Fatal编程技术网

Batch file 如何检测输入是否为引号?

Batch file 如何检测输入是否为引号?,batch-file,if-statement,cmd,special-characters,Batch File,If Statement,Cmd,Special Characters,我有以下代码 if "%userInput%"==""" ( do_something ) 我想让它检测%userInput%是否是一个引号(“)。但是,此代码会抛出一个错误 如何检测输入是否是带有附加变量和延迟扩展的报价?: @echo off set /p quote=Enter quote set "test_quote="" setlocal enableDelayedExpansion if !quote! equ !test_quote! echo equal …并且

我有以下代码

if "%userInput%"==""" (
    do_something
)
我想让它检测
%userInput%
是否是一个引号(
)。但是,此代码会抛出一个错误


如何检测输入是否是带有附加变量和延迟扩展的报价?

@echo off

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

if !quote! equ !test_quote! echo equal

…并且可能不会延迟扩展:

@echo off

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

if !quote! equ !test_quote! echo equal
@Echo关闭
设置/P“输入=请输入字符:”
如果[^%input%]=[^”](回显它是一个引号)其他回显它是其他东西
超时-1
正如您询问的“如果输入包含报价”。只需找到它:

set "i=hello " world"
set i|find """" >nul && echo yes || echo no
注意:
echo%i%| find”“”“
可能不适用于未配对的引号,但
set
不关心


注意
语法(看起来很奇怪,不直观)
find
似乎没有使用通常的转义:
find“^”
给出语法错误。

这里有一个没有延迟扩展的解决方案,可以处理任何输入,包括空格和有毒字符。我的测试代码处于循环中。当您准备退出时,只需按
,而不必键入任何内容

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

但是FIND无法确定输入是否与单个引号字符完全匹配

使用FINDSTR的简单单行程序可以解决此问题

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

啊!!当我在几乎所有脚本上使用延迟扩展时,我是如何忘记它的:/n不需要第二个变量:
if!引用eq^“echo equal
如果您的输入包含空格,脚本将fail@Compo我曾经考虑过您的方法,但注意到在输入时,空格和特殊字符将失败。键盘猫无处不在。问题是检查报价为单个字符,而不是一系列字符,例如,您可以使用
如果[^%输入:~,1%]=[^”]
检查特定字符。如果该字符是一个可以在单独的
If
中容纳的空间,但超出了问题的范围。我的回答不是作为一个通用的健壮解决方案给出的,只是一个替代方案,以表明启用延迟扩展不是唯一的解决方案,而是最好的解决方案。@Compo您的上一个Common确实是正确的。我也理解我要求只检查1个字符的问题。您的示例也是一个很好的示例,因为它是无扩展延迟的,并且不必担心脚本其他位置的输入。
“”
语法真的很奇怪。但是根据,
find
确实使用了不常见的转义方式。+1您的解释是“包含引号”最常见的解释。但稍后的OP会问“如何检测输入是否为引号?”,这是完全不同的。FIND无法确定输入是否与报价完全匹配,但FINDSTR可以。请参阅@dbenham@Stephan也许我的帖子
包含了两个不同的问题。我应该将“包含报价”改为“是报价”?@SteveFest-当然,“是报价”或“等于报价”将使问题更清楚。当我删除
if not defined
语句时,如果我不输入任何内容,脚本仍然会退出,并抛出语法错误。是的,如果变量未定义,则无法执行if比较,因为
%undefinedVar:=“”%“
扩展为
“”=“””
这一预防措施是否有效:将
var
设置为某种未使用的字符串,以便它可以比较该字符串,而不是空的用户输入。我将创建另一个
test
变量,这样您就不会干扰原始变量。我将更新无法更新的应答。
只会得到“扩展”如果启用了延迟扩展,则在禁用延迟扩展的情况下测试代码时,将保留输入中的
2>nul set var|findstr /x "var=\^"" >nul && echo equals quote THIS DOES NOT WORK