我需要获取传递给Windows批处理脚本的最后一个参数,我该如何做到这一点?
这将得到参数的数量:
set count=0
for %%a in (%*) do set /a count+=1
要获取实际的最后一个参数,你可以这样做:
for %%a in (%*) do set last=%%a
请注意,如果命令行中存在不平衡的引号,这将失败 - 命令行由for
重新解析,而不是直接使用用于%1
等的解析。
最简单且可能最可靠的方法是使用cmd
自己的参数解析,并使用shift
直到没有更多参数。
由于这会破坏对%1
等的使用,因此可以在子程序中执行此操作:
@echo off
call :lastarg %*
echo Last argument: %LAST_ARG%
goto :eof
:lastarg
set "LAST_ARG=%~1"
shift
if not "%~1"=="" goto lastarg
goto :eof
Joey的回答的增强版:链接
@ECHO OFF
SETLOCAL
:test
:: https://dev59.com/C1bUa4cB1Zd3GeqPAJ7Z#5807218
CALL :lastarg xxx %*
ECHO Last argument: [%XXX%]
CALL :skiplastarg yyy %*
ECHO skip Last argument: [%yyy%]
GOTO :EOF
:: Return all but last arg in variable given in %1
:skiplastarg returnvar args ...
SETLOCAL
SET $return=%1
SET SKIP_LAST_ARG=
SHIFT
:skiplastarg_2
IF NOT "%~2"=="" SET "SKIP_LAST_ARG=%SKIP_LAST_ARG% %1"
SHIFT
IF NOT "%~1"=="" GOTO skiplastarg_2
ENDLOCAL&CALL SET "%$return%=%SKIP_LAST_ARG:~1%"
GOTO :EOF
:: Return last arg in variable given in %1
:lastarg returnvar args ...
SETLOCAL
SET $return=%1
SET LAST_ARG=
SHIFT
:LASTARG_2
SET "LAST_ARG=%1"
SHIFT
IF NOT "%~1"=="" GOTO lastarg_2
ENDLOCAL&call SET %$return%=%LAST_ARG%
GOTO :EOF
使用以下参数运行它:
abe "ba na na" "cir cle"
并得到:
最后一个参数:["cir cle"]
忽略最后一个参数:[abe "ba na na"]
set first=""
set last=""
for %%a in (%*) do (
SETLOCAL ENABLEDELAYEDEXPANSION
if !first!=="" (set first=!last!) else (set first=!first! !last!)
set last=%%a
)
ENDLOCAL & set "last=%last%" & set "first=%first%"
echo %last% "and" %first%