批处理-IF语句中使用的变量中的引号和括号

时间:2020-01-23 11:29:38

标签: batch-file

我一直在尝试将脚本转换为允许在

之类的参数中使用引号和括号。
script.bat -filter "Example*"
script.bat -filter "example (3.8.1)"

行情和括号可以从%1中删除,但必须保留在ProgramName中。可以修改下面的代码以接受引号和括号吗?

@echo off
@setlocal enabledelayedexpansion

echo.
set "programName="
set "filterOrName="
set "listSelected=false"

:parseLoop

echo arg1: %1

IF NOT "%1"=="" (

    IF "%1"=="-filter" (
        set filterOrName=%1
        IF NOT "%2"=="-filter" IF NOT "%2"=="-name" IF NOT "%2"=="-list" (
            set ProgramName=%2
        )
    )
    IF "%1"=="-name" (
        set filterOrName=%1
        IF NOT "%2"=="-filter" IF NOT "%2"=="-name" IF NOT "%2"=="-list" (
            set ProgramName=%2
        )
    )
    IF "%1"=="-list" (
        set "listSelected=true"
    )
    SHIFT
    GOTO :parseLoop
)

echo filterOrName: !filterOrName!
echo listSelected: !listSelected!
echo ProgramName: !ProgramName!

1 个答案:

答案 0 :(得分:4)

这是一种常见的批处理技术,始终使用%~1语法去除外部引号。

在使用该内容的所有地方,再次将其用引号引起来。

...
IF "%~1"=="-filter"  ... 
set "programName=%~2"
...
echo start the program
"%programName%" argument1 argument2 ...

set "programName=%~2"的说明:
在这里,使用引号的set语法set "varname=content"(第一个引号必须位于varname的前面)。
此语法将内容存储到<varname>中,但不带引号(如果内容本身带有引号,则仅包含引号)。

当内容包含特殊字符(例如&<>|^)时,此语法避免了很多问题。
它还避免了set var=content<space><space>末尾的意外空格,因为最后一个引号之后的所有内容都被删除。

使用延迟扩展
延迟扩展解决了输出任意内容时的许多问题。
当内容包含引号或其他特殊字符(如&|<>
时,它可以避免问题) 延迟扩展的优点在于,它可以扩展变量而无需稍后解释内容。

set "var=example (3.8.1)"
echo #1 %var% - works
setlocal EnableDelayedExpansion
(
  echo #2 !var! -- works
)
(
  echo #3 %var% -- fails because var contains a closing parentheses
)
相关问题