使用第二个参数的值来获得第五个参数

时间:2013-12-03 04:36:24

标签: batch-file command-line cmd command-line-arguments

我在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)的问题,但这显然不起作用。

3 个答案:

答案 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个)