【问题标题】:windows 7 remaining batch file argumentswindows 7 剩余的批处理文件参数
【发布时间】:2013-03-15 05:18:51
【问题描述】:

在 Windows 批处理文件中,我知道 %1 被第一个参数替换,%2 被第二个参数替换,%* 被所有参数替换。

有没有办法在第一个参数之后获取所有参数? (例如参数 2-N)第二个之后的所有参数呢?

SHIFT 命令似乎不会影响%*

【问题讨论】:

    标签: windows for-loop batch-file cmd


    【解决方案1】:
    @ECHO OFF
    SETLOCAL
    CALL :allafter 3 %*
    ECHO args=%args%
    GOTO :eof
    
    :allafter
    FOR /l %%a IN (1,1,%1) DO SHIFT
    (SET args=)
    :argloop
    shift
    IF NOT .%1==. SET args=%args% %1&GOTO argloop
    IF DEFINED args SET args=%args:~1%
    GOTO :eof
    

    获取ARGS 的第三个参数之后的所有内容


    编辑 - 处理空格分隔的元素,其中可能包括逗号

    @ECHO OFF
    SETLOCAL
    CALL :allafter 3 %*
    ECHO args=%args%
    CALL :allafter2 3 %*
    ECHO args=%args%
    GOTO :eof
    
    :allafter
    FOR /l %%a IN (1,1,%1) DO SHIFT
    (SET args=)
    :argloop
    shift
    IF NOT .%1==. SET args=%args% %~1&GOTO argloop
    IF DEFINED args SET args=%args:~1%
    GOTO :EOF
    
    :allafter2
    SET /a count=%1
    SET args=%*
    :arg2loop
    SET oldargs=%args%
    call SET args=%%args:*%1 =%%
    IF "%args%"=="%oldargs%" (call SET args=%%args:*%1,=%%) ELSE (SET /a count-=1)
    shift
    IF %count% gtr -1 GOTO arg2loop
    GOTO :EOF
    

    嗯- 说得太早了。这个修改后的例程应该会玩得更好。当调用 remove-leading-n 时,以前的版本将定义为一个参数 one,two,three 的内容视为三个单独的参数。

    【讨论】:

    • 如果我用参数a b c d e,f 调用它,那么我会得到d e f 而不是d e,f。有没有办法解决它,以便它允许参数内逗号?
    • @tennenrishin 您需要在"quotes" 中包含一个包含逗号的参数。结果将包含仍在引号中的参数。要删除引号,请将 SET args=%args% %1 更改为 SET args=%args% %~1
    • 谢谢,但在我的情况下,调用已给出,我无法更改它。这是否意味着不可能?
    【解决方案2】:

    嗯,有一种方法……

    通过在shift 命令上使用/n 开关,您可以做类似的事情。但是,它将删除所有参数并将它们放入某个变量中(因此,如果没有 for 循环,您将无法再调用 %3

    @setlocal enableextensions
    @echo off
    :loop
    if "%~2" equ "" goto end
    set variable=%variable% %~2
    shift /2
    goto loop
    :end
    echo %1
    echo %variable%
    endlocal
    

    要再次分离参数,只需执行一个简单的for 循环(我相信您可以在某处找到有关它的文档)。

    【讨论】:

    • +1,虽然没有理由启用延迟扩展,因为您没有使用它。
    • @dbenham 有趣的故事。我放入了延迟扩展而不是扩展,我花了 10 分钟试图找出为什么这件事不起作用。我想我忘了把它拿出来。
    • 您介意更新脚本以删除它们吗?这看起来是最简单的,但我不熟悉延迟扩展,所以我不知道它的含义是什么。
    • 当然,我也会删除我的错字。
    • 如果我用参数a b c,d 调用它,那么我会得到b c d 而不是b c,d。有没有办法解决它,以便它允许参数内逗号?
    【解决方案3】:

    没有shift & goto的解决方案:

    @echo off &setlocal enabledelayedexpansion
    set /a count=0
    for %%i in (%*) do set /a count+=1
    set "args="
    for /l %%i in (2,1,%count%) do if defined args (call set "args=!args! %%%%i") else call set "args=%%%%i"
    echo.%args%
    endlocal
    

    【讨论】:

    • 不,如果不使用 SHIFT,您无法访问大于 %9 的参数,(除非您使用 %* 并编写自己的 arg 解析器)
    • 即使按照 dbenham 所说的,+1 表示努力。
    【解决方案4】:
    > type t.bat
    @echo off
    echo %*
    for  /f "tokens=1,*delims= " %%i in ("%*") do echo %%j
    
    > t a b c d e f,g h i
    a b c d e f,g h i
    b c d e f,g h i
    
    > t a,a b c d e f,g h i
    a,a b c d e f,g h i
    b c d e f,g h i
    
    >
    

    【讨论】:

      猜你喜欢
      • 2011-08-09
      • 2022-01-09
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      相关资源
      最近更新 更多