Windowsbatch file是否具有%*结构?

在一个batch file中,我必须做(例如)以下吗?

@echo off call other.bat %1 %2 %3 %4 %5 %6 %7 %8 %9 

Windowsbatch file(因为Windows XP,但可能更早)支持%*结构,该结构从%1开始计算所有参数。

不幸的是,这不符合SHIFT命令,所以下面的行不通:

 @echo off set EATEN=%1 shift call other.bat %* 

它仍然会将第一个parameter passing给第二个batch file。

你可以用下面的东西把所有的参数集合在一起:

 set args=%1 shift :start if [%1] == [] goto done set args=%args% %1 shift goto start :done (use %args% here) 

无论有多less个参数,这都是有效的。

例如,如果您想跳过前三个参数,并传递其余参数:

 @echo off for /f "tokens=1-3*" %%a in ("%*") do ( set par1=%%a set par2=%%b set par3=%%c set therest=%%d ) call other.bat %therest% 

参数中引号可能有问题。

荣誉Patrick Cuff, https://stackoverflow.com/questions/382587/how-to-get-batch-file-parameters-from-nth-position-on

是的,他们有。

你可以写你的例子如下:

 @echo off call other.bat %* 

另外:窗口支持移位…看到这个 。
但确实,最后一个链接确认了转换不能与%*结合使用:

•在换class时使用%*
Shift对%*批量参数没有影响。

 @echo off cls setlocal enabledelayedexpansion :: Disable the display of information by changing [set "_ENABLE_INFO="] to [set "_ENABLE_INFO=::"]. set "_ENABLE_INFO=" set _DBQ=" set "_PARMS.ORIGINAL=%*" && if defined _PARMS.ORIGINAL ( if not defined _PARMS.IDX ( echo Parameter Index^(es^) to extract eg.: echo 1 2 5 9 11 39 400 set /p "_PARMS.IDX=>" ) set "_PARMS.IDX=¡!_PARMS.IDX: =¡ ¡!¡" set "_PARMS.IDX=!_PARMS.IDX:¡¡=!" set "_PARMS.IDX=!_PARMS.IDX: =!" call :_FN_PROC.STRING %* %_ENABLE_INFO% goto :FINISH goto :eof ) else ( echo No input parameters. ) goto :eof :_FN_PROC.STRING set "_PARMS.PROCESS.STRING=%*" :_FN_PROC.STRING.LOOP set "_PARMS.PROCESS.STRING=!_PARMS.PROCESS.STRING:%_DBQ%=¡!" set /a _PARMS.COUNT+=1 for /f "tokens=1* delims= " %%a in ("!_PARMS.PROCESS.STRING!") do ( set _PARMS.TMP.CHECK=%%a set _PARMS.PROCESS.STRING=%%b if "!_PARMS.TMP.CHECK!" NEQ "!_PARMS.TMP.CHECK:¡=!" ( for /f "tokens=1* delims=¡" %%c in ("%%a !_PARMS.PROCESS.STRING!") do ( set _PARMS.TMP.CHECK="%%c" set _PARMS.PROCESS.STRING=%%d ) ) ) if "!_PARMS.IDX:¡%_PARMS.COUNT%¡=!" EQU "!_PARMS.IDX!" ( set _PARMS.REMAINING=!_PARMS.REMAINING! !_PARMS.TMP.CHECK! set _PARMS.IDX=!_PARMS.IDX!{%_PARMS.COUNT%} ) else ( set _PARMS.EXTRACTED=!_PARMS.EXTRACTED! !_PARMS.TMP.CHECK! set _PARMS.IDX=!_PARMS.IDX:¡%_PARMS.COUNT%¡=! set _PARMS.IDX=!_PARMS.IDX![%_PARMS.COUNT%] ) if "!_PARMS.PROCESS.STRING: =!"=="" (set _PARMS.PROCESS.STRING=) if defined _PARMS.PROCESS.STRING (goto :_FN_PROC.STRING.LOOP) set _DBQ= set _PARMS.TMP.CHECK= if defined _PARMS.REMAINING (set _PARMS.REMAINING=!_PARMS.REMAINING:~1!) if defined _PARMS.EXTRACTED (set _PARMS.EXTRACTED=!_PARMS.EXTRACTED:~1!) goto :eof :FINISH echo. echo _PARMS.IDX ^: echo ¡^=¡ no Parameter Index was specified for extraction. echo ¡n¡ nth Parameter was not processed (Index larger than Parameters Count). echo [n] nth Parameter was Extracted. echo {n} nth Parameter was Ignored (Remaining). echo. set _ goto :eof