我在stackoverflow上的其他地方得到了以下代码:
@echo off
rem throw the first parameter away
shift
set params=%1
:loop
shift
if [%1]==[] goto afterloop
set params=%params% %1
goto loop
:afterloop
@echo %params%
@echo on
结果:正在运行shifttest 1 2 3 4 5 6 7 8
会产生2 3 4 5 6 7 8
经过进一步测试,我发现我可以通过执行以下操作抛弃前两个参数:
@echo off
rem throw the first two parameters away
shift
set params=%2
:loop
shift
if [%2]==[] goto afterloop
set params=%params% %2
goto loop
:afterloop
@echo %params%
@echo on
结果:正在运行shifttest 1 2 3 4 5 6 7 8
会产生2 3 4 5 6 7 8
我还发现我可以用%2
替换%3
以丢掉前三个,依此类推......
我的问题: 有没有办法指定要扔掉多少参数?
示例:运行shifttest 5 2 3 4 5 6 7 8
会产生6 7 8
,即第一个参数指定要丢弃的参数数量,包括第一个参数。
我正在考虑%(%1)
的问题,但这显然不起作用。
答案 0 :(得分:0)
鉴于这个简单的批处理文件( test.bat ),它使用for循环到shift
命令行参数%1
次:
@echo off
for /L %%i in (1,1,%1) do shift
echo %1 %2 %3 %4 %5 %6 %7 %8 %9
我得到以下内容:
c:\>test 1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9
c:\>test 5 2 3 4 5 6 7 8 9
6 7 8 9
您可以轻松地调整此技术,将params
设置为其余参数。例如:
@echo off
for /L %%i in (1,1,%1) do shift
set params=
:loop
if [%1]==[] goto afterloop
if defined params (set params=%params% %1) else (set params=%1)
shift
goto loop
:afterloop
echo %params%
现在运行它会产生以下结果:
c:\>test 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
c:\>test 5 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
6 7 8 9 10 11 12 13 14 15 16 17 18
答案 1 :(得分:0)
没有直接方法可以做到这一点。这是一个简单的解决方法:
@echo off
setlocal EnableDelayedExpansion
for /L %%i in (1,1,%1) do shift
:loop
if [%1] == [] goto afterloop
set params=%params% %1
shift
goto loop
:afterloop
echo %params%
您指定为%(%1)
的构造将等同于以下构造,如果这样的构造是可能的!
echo The parameter indicated by first one (the fifth): !%1
即,将%1扩展为5,然后将扩展为替换。将!5扩展到第五个参数,但是这个构造不对Batch fle参数,仅对变量有效。实现复杂管理的常用方法是首先将参数存储在数组中,然后访问数组元素。例如:
@echo off
setlocal EnableDelayedExpansion
set n=0
:loop
if [%1] == [] goto afterloop
set /A n+=1
set param[%n%]=%1
shift
goto loop
:afterloop
echo The parameter indicated by first one (the fifth): !param[%param[1]%]!
答案 2 :(得分:0)
@ECHO OFF
SETLOCAL
SET val=%1 %*
FOR /l %%i IN (1,1,%1) DO CALL SET "val=%%val:* =%%"
FOR /f %%j IN ("%val%") DO SET "val=%%j"
ECHO val=+%val%+
GOTO :EOF
使用val
执行时,会将thisbatch n 2 3 4 5 6 7
设置为第n个参数
如果n> #parameters,则返回最后一个。
删除%1
中的%1 %*
以产生编号为thisbatch n 1 2 3 4 5 6 7
的参数(即n = 1,在n之后产生第1个)