检查字符串是否被引用以及向字符串添加引号的问题

时间:2015-07-11 15:41:49

标签: batch-file cmd escaping quotes

我试图通过检查字符串的第一个和最后一个字符来检查字符串是否被引用。但是我的脚本在检查引用时看到输出失败:此时AND是意外的。下方。

代码

@echo off

set mystring=Non quoted string

set myquotedstring=^"My quoted string^"

echo mystring: %mystring%

echo myquotedstring: %myquotedstring%

set result=%mystring:~0,1%

echo first character of non quoted string is: %result%

set result=%mystring:~-1%

echo last character of non quoted string is: %result%

if %mystring:~0,1%u==^" AND %mystring:~-1%==^" (
   echo this string is NOT quoted
   set newstring=^"Non quoted string^"
   echo newstring: %newstring%
)

set result=%myquotedstring:~0,1%

echo first character of quoted string is: %result%

set result=%myquotedstring:~-1%

echo last character of quoted string is: %result%

if %myquotedstring:~0,1%u==^" AND %myquotedstring:~-1%==^" (
   echo this string is quoted
)

这是我得到的输出

mystring: Non quoted string
myquotedstring: "My quoted string"
first character of non quoted string is: N
last character of non quoted string is: g
this string is NOT quoted
newstring: "Non quoted string"
first character of quoted string is: "
last character of quoted string is: "
AND was unexpected at this time.

更新

我意识到现在我不能使用AND。但即使我删除我也有问题。

例如

if %mystring:~0,1%u==^" if %myquotedstring:~-1%==^" (
   echo this string is NOT quoted
   set newstring=^"Non quoted string^"
   echo newstring: %newstring%
)

我得到了

The syntax of the command is incorrect.

4 个答案:

答案 0 :(得分:3)

我纠正了你得到的语法错误。这可能是因为错误的逃脱序列。由于此documentation,您应该使用""代替^"。但它对我来说也不起作用,处理双引号有点棘手。

就个人而言,我在操作字符串之前用"或其他字符替换+。所以这段代码工作正常:

set myquotedstring="My quoted string"

set firstChar=%myquotedstring:~0,1%
set lastChar=%myquotedstring:~-1%

:: Replace " with +
set firstChar=%firstChar:"=+%
set lastChar=%lastChar:"=+%

if "%firstChar%"=="+" if "%lastChar%"=="+" (
    echo "myquotedstring is quoted"
)

答案 1 :(得分:2)

批量中没有AND。使用

if var1==value1 if var2==value2 echo both ok

代替。

答案 2 :(得分:1)

@echo off
setlocal EnableDelayedExpansion

set mystring=Non quoted string
echo %mystring%
if !mystring:~0^,1!!mystring:~-1! equ "" (
   echo -^> String is quoted
) else (
   echo -^> String not quoted
   set newstring="%mystring%"
   echo New string: !newstring!
)
echo/

set mystring="My quoted string"
echo %mystring%
if !mystring:~0^,1!!mystring:~-1! equ "" (
   echo -^> String is quoted
) else (
   echo -^> String not quoted
   set newstring="%mystring%"
   echo New string: !newstring!
)

答案 3 :(得分:-1)

为什么要检查字符串是否被引用并添加引号?

将字符串分配给没有引号的环境变量并使用批处理文件中的引号几乎总是更好,它必须在引用环境变量时完成,但在不需要时引用环境变量值而不需要引号回显行。

示例:

@echo off
setlocal EnableDelayedExpansion
echo First argument without quotes is:  %~1
echo First argument with quotes is:    "%~1"
set "UserInput=""
set /P "UserInput=Please enter something: "
set "UserInput=!UserInput:"=!"
echo User input without quotes is:  %UserInput%
echo User input with quotes is:    "%UserInput%"
endlocal

在此示例中,启用了第一个延迟环境变量扩展,另外还创建了当前环境变量表的副本。

如果使用1个或多个参数调用批处理文件,则第一个输出是在没有引号的情况下调用它时传递给批处理文件的第一个参数。

%~1的解释由命令调用call /?的命令提示符窗口中执行。

这只是演示如何最好地处理批处理文件参数。批处理文件参数应始终用%~引用,并且如果必要,则将此字符串放在双引号中,例如当参数是文件或目录名称或带有空格或其他字符的字符串时,需要在传递批处理文件参数时引用其他命令或应用程序。

在命令提示符窗口中运行cmd /?时显示的上一个帮助页面上, cmd 输出的帮助中列出了需要引用字符串的字符。

接下来创建环境变量UserInput,并将双引号作为默认值分配给变量。

here解释了使用set "variable=value"的原因。

批处理文件的用户只需按键 RETURN 而不是输入字符串,在这种情况下,引号仍然分配给环境变量UserInput。否则,用户输入的字符串将分配给UserInput

批处理文件使用下一个延迟扩展来删除用户输入字符串中的所有引号。这就是为什么将报价指定为UserInput的默认值的原因。如果用户只是点击 RETURN 而没有输入任何内容而没有默认值,则批处理文件的输出将是错误的。如果用户必须输入字符串,我喜欢使用引号作为默认值,因为如果用户输入除1或更多引号之外的任何内容,我可以在删除引号后轻松检查。当然,有时候分配一个有意义的默认值是有意义的,它可以让用户只需按下 RETURN 键继续使用默认值。

使用延迟扩展,因为如果引用UserInput的值没有延迟,则用户可以输入可能导致意外行为的字符串或执行时出现语法错误。

这可以在输入例如!TEMP!时看到,因为批处理文件的输出是环境变量 TEMP 的值,而不是真正输入的字符串。因此,一般建议从用户输入的字符串中删除所有关键字符,例如< > ! %,并使用与引号相同的方法。

最后,删除现在另外包含UserInput的环境变量表,并使用命令endlocal恢复以前的环境变量表,如果此批处理文件永远不会在批处理文件的末尾也可以省略从另一个批处理文件调用。

从用户输入中同时删除<>以及!的示例。

@echo off
setlocal EnableDelayedExpansion
set "UserInput=""
set /P "UserInput=Please enter something: "
set "UserInput=!UserInput:"=!"
set "UserInput=!UserInput:<=!"
set "UserInput=!UserInput:>=!"
set "UserInput=%UserInput:!=%"
echo User input without quotes is:  %UserInput%
echo User input with quotes is:    "%UserInput%"
endlocal

有关延迟环境变量扩展的说明,请打开命令提示符窗口,执行set /?并读取控制台窗口中输出的所有帮助页面。

编辑于2015-07-14:

但是,如果环境变量值应始终与周围的引号无关,而不依赖于在命令行上传递给批处理文件,或由用户输入或从文件中读取的内容,则最好将值重新分配给从值中删除所有引号后带有引号的变量。

此演示代码演示了这个单行:

@echo off
set "MyString=Non quoted string"
echo Before: %MyString%
set "MyString="%MyString:"=%""
echo After:  %MyString%

set MyString="Quoted string"
echo Before: %MyString%
set "MyString="%MyString:"=%""
echo After:  %MyString%

set "MyString="Single quote at begin"
echo Before: %MyString%
set "MyString="%MyString:"=%""
echo After:  %MyString%

set "MyString=Single quote at end""
echo Before: %MyString%
set "MyString="%MyString:"=%""
echo After:  %MyString%

set "MyString="

输出结果为:

Before: Non quoted string
After:  "Non quoted string"
Before: "Quoted string"
After:  "Quoted string"
Before: "Single quote at begin
After:  "Single quote at begin"
Before: Single quote at end"
After:  "Single quote at end"

这可以在没有延迟扩展的情况下完成,因为可以看出。

如果环境变量值也可以在字符串内的任何位置引用并且不被删除,则不能使用单行set "MyString="%MyString:"=%""