我一直在尝试将脚本转换为允许在
之类的参数中使用引号和括号。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!
答案 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
)