在Windows批处理文件中获取最后一个命令行参数

8
我需要获取传递给Windows批处理脚本的最后一个参数,我该如何做到这一点?

请点击这里 - Ken White
4个回答

13

这将得到参数的数量:

set count=0
for %%a in (%*) do set /a count+=1

要获取实际的最后一个参数,你可以这样做:

for %%a in (%*) do set last=%%a

请注意,如果命令行中存在不平衡的引号,这将失败 - 命令行由for重新解析,而不是直接使用用于%1等的解析。


2
你为什么回答参数计数?那不是问题所在。 - Joey

10

最简单且可能最可靠的方法是使用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

1

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"]


谢谢,有时候处理最后几个参数并将其原样传递会有所帮助。 - Enno

0
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%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接