3 cmd if-statement batch-file special-characters
我有以下代码
if "%userInput%"==""" (
do_something
)
Run Code Online (Sandbox Code Playgroud)
我想检测它是否%userInput%
是引号("
).但是,此代码会引发错误.
如何检测输入是否为引用?
当你问"输入是否包含引用"时.就是find
这样:
set "i=hello " world"
set i|find """" >nul && echo yes || echo no
Run Code Online (Sandbox Code Playgroud)
注意:echo %i%|find """"
可能不适用于不成对的引号,但set
不关心.
注意""""
语法(看起来很奇怪并且不直观).find
似乎没有使用通常的转义:find "^""
给出语法错误.
这是一个没有延迟扩展的解决方案,它应该适用于任何输入,包括空格和有毒字符。我的测试代码在循环中。当您准备退出时,只需按<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
Run Code Online (Sandbox Code Playgroud)
诀窍应该是相当明显的。将值括在引号中,并在扩展期间将所有内部引号加倍,从而保证所有标记分隔符和毒字符都被引用。当然,在右侧,您必须包括封闭引号,以及您尝试匹配的双引号(总共 4 个)。
如果您需要能够通过 IF 测试传递所有输入(包括无值),那么您可以定义一个测试变量。类似于以下内容(假设 var 已经有用户输入)
set "test="
if defined var set "test=%var:"=""%"
if "%test%" == """" echo equals quote
Run Code Online (Sandbox Code Playgroud)
使用 FINDSTR 的替代解决方案
我受到Stephan 回答的启发,使用 FINDSTR 找到了不需要延迟扩展的替代解决方案。他以不同的方式解释了这个问题,回答了“输入值是否在其中的任何地方包含引号?”的问题,并使用 FIND 解决了这个问题。
但 FIND 无法确定输入是否与单引号字符完全匹配。
一个带有 FINDSTR 的简单单衬可以解决这个问题。
2>nul set var|findstr /x ^"var=\"" >nul && echo equals quote
Run Code Online (Sandbox Code Playgroud)
或者
2>nul set var|findstr /x "var=\"^" >nul && echo equals quote
Run Code Online (Sandbox Code Playgroud)
请注意,FINDSTR 通常需要将引号转义为\"
,并且批处理解析器需要将其中一个引号转义为,^"
因为有奇数个引号。如果引号未转义,则该行的其余部分将被视为字符串的一部分,而不是重定向和条件执行操作。
另请注意,使用批处理解析器,一旦激活引用,就不可能转义引用。所以以下不起作用
2>nul set var|findstr /x "var=\^"" >nul && echo equals quote THIS DOES NOT WORK
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1214 次 |
最近记录: |