【问题标题】:Use the value of the second parameter to get the fifth使用第二个参数的值得到第五个
【发布时间】:2013-12-19 00:38:29
【问题描述】:

我在 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) 的东西,但这显然行不通。

【问题讨论】:

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


    【解决方案1】:

    鉴于这个简单的批处理文件 (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
    

    【讨论】:

      【解决方案2】:

      没有直接的方法可以做到这一点。这是一个简单的解决方法:

      @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 扩展到第五个参数,但此构造对批处理文件参数起作用,仅对变量起作用。实现复杂管理的常用方法是首先将参数存储在一个数组中,然后访问数组元素。例如:

      @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]%]!
      

      【讨论】:

        【解决方案3】:
        @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
        

        在使用thisbatch n 2 3 4 5 6 7 执行时将val 设置为第n 个参数

        如果 n>#parameters,则返回最后一个。

        删除%1 %* 中的%1 以产生编号为thisbatch n 1 2 3 4 5 6 7 的参数(即n=1 在n 之后产生第一个)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-04
          • 1970-01-01
          • 2017-11-19
          • 2010-10-04
          • 1970-01-01
          • 2018-03-22
          • 2016-07-23
          • 1970-01-01
          相关资源
          最近更新 更多