Syn*_*ech 3 arguments batch-file
我正在尝试向批处理文件添加一些可选参数,但遇到了问题,因为该SHIFT命令不影响all-arguments变量%*。
有谁知道如果我必须使用,我如何允许可选的批处理文件参数%*?
例如,一个简单的示例,它仅将带有和不带有换行符的参数打印到屏幕上,使用可选参数来确定哪个:
@echo off
if (%1)==() goto usage
if (%1)==(/n) goto noeol
goto eol
:eol
echo %*
goto :eof
:noeol
shift
call showline %*
goto :eof
:usage
echo Prints text to the screen
echo > %0 [/n] TEXT
echo /n to NOT print a new-line at the end of the text
goto :eof
Run Code Online (Sandbox Code Playgroud)
如您所知,shift对 没有影响%*,但您可以构造一个 %* 等效项。
我们将调用以下内容line.bat :
@echo off
set line=%1
:loop
shift
if not "%1"=="" (
set line=%line% %1
goto :loop
)
echo %%* = %*
echo line = %line%
Run Code Online (Sandbox Code Playgroud)
如果您输入以下命令(注意 3 和 4 之间的双空格):
line 1 2 3 4 bla dee dah
Run Code Online (Sandbox Code Playgroud)
您将获得以下输出:
%* = 1 2 3 4 bla dee dah
line = 1 2 3 4 bla dee dah
Run Code Online (Sandbox Code Playgroud)
注意%*保留多个空格,而使用%n符号则不会。
使用这样的东西,您可以允许您的用户以任何顺序放置他们的参数。
:loop
:: Single variable parameters
if "%1"=="something" set something=true
:: Multi variable parameters
if "%~1"=="/source" shift & set source=%1
shift
if not "%~1"=="" goto :loop
Run Code Online (Sandbox Code Playgroud)
请注意,在多变量参数语句中,我包含一个shift语句和一个set由与号 (&) 分隔的语句。该&告诉命令处理器要执行的单独的命令如下。
编辑:
仅供参考:我建议在检查变量内容时使用双引号。通常您可以使用任何字符,甚至不需要使用两个字符,因为它们只是为了确保空变量不会导致错误。例如, when%1为空并且您执行if not hello==%1 call :sub命令处理器将看到这一点if not hello== call :sub并进行比较hello,call然后尝试执行:sub,并抛出错误。在那种特定情况下if not xhello==x%1 call :sub也一样好if not "hello"=="%1" call :sub,因为空%1将导致命令处理器看到if not xhello==x call :sub.
但是,如果变量包含任何特殊字符,则使用双引号以外的字符会导致问题。
使用方括号作为变量分隔符(如 (%1))可能会导致问题。例如,(特殊)管道字符在方括号内效果不佳,转义字符似乎消失了,既不充当普通字符,也不充当转义字符。
此外,括号本身是特殊字符,旨在对不同的代码行进行分组和/或分隔,并且可能并不总是按预期工作。
最后,双引号本身是专门设计用于包围其他特殊字符的特殊字符,允许它们充当普通字符。这就是为什么你可能会看到变量没有被引用,然后又被引用,就像这样。
set var="%~1" & REM This sort of thing is used to insure that a variable is quoted.
REM %~1 unquotes %1 if it is already quoted, and leaves it alone if
REM %1 is not quoted.
set "var=%~1" & REM This code assumes that `%1` contains special characters and
REM like before unquotes a quoted %1, but leaves the variable itself
REM unquoted. The double-quotes surrounding the variable and data
REM protects the command processor from any special characters that
REM exist in the data. Remember that anytime you reference `%var%`,
REM you will need to also surround the variable and data with
REM double-quotes.
Run Code Online (Sandbox Code Playgroud)
快速检查报价是if exist %1 if %1==%~1 echo Unquoted.