【问题标题】:How to pass additional extra arguments to a batch file?如何将额外的额外参数传递给批处理文件?
【发布时间】:2012-09-01 06:18:12
【问题描述】:

我想使用传递给批处理文件的前 2 个参数,然后将其他所有内容附加到批处理文件中执行的命令中。

有没有简单的方法可以做到这一点?

// batch file
command -Duser=%1 -Dpwd=%2 {? how to pass all remaining arguments on the command line}

批处理会这样执行

batch.bat USR PWD -Dargument1=1 -Dargument2=2

实际上,我希望执行以下操作

command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2

【问题讨论】:

    标签: batch-file command-line-arguments


    【解决方案1】:

    for 命令应该会给你你想要的:

    for /f "tokens=1,2*" %%a in ("%*") do echo command -Duser=%%a -Dpwd=%%b %%c
    

    来自for (for /?) 的帮助:


    FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k 将解析 myfile.txt 中的每一行,忽略以 一个分号,将每行的第二个和第三个标记传递给 for 正文,以逗号和/或空格分隔的标记。 注意 正文语句引用 %i 以获取第二个令牌,%j 以获取 第 3 个令牌,以及 %k 以获取第 3 个之后的所有剩余令牌。 包含空格的文件名,您需要用 双引号。为了以这种方式使用双引号,您还 需要使用 usebackq 选项,否则双引号会 解释为定义要解析的文字字符串。


    所以在我的解决方案中,%%a 将第一个参数的值传递给脚本,%%b 第二个参数的值,%%c 其余参数。

    当我从命令提示符运行batch.bat USR PWD -Dargument1=1 -Dargument2=2 时,我得到:

    command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2
    

    删除do 之后的echo 以使用参数调用您的命令。

    【讨论】:

    • 只要前 2 个参数都不包含带引号的空格,它就可以工作。但是,如果任一参数包含带引号的空格,它将失败 - 可能不是用户名或密码的问题,绝对不能作为一般解决方案接受。
    • @dbenham;你是对的,传递任何类型的带引号的字符串,所有的赌注都关闭了。
    • 实际引用的参数是可以的,只要引号是平衡的并且参数不包含空格或特殊字符,如& | 等。另一个潜在问题 - 参数也可以由, ;= 而不是空格。
    【解决方案2】:

    Patrick Cuff 的解决方案通常有效,但如果前 2 个参数中的任何一个包含带引号的空格或特殊字符,它将失败。如果参数用空格以外的东西分隔,它也会失败。 FOR /F 分隔符可以扩展为包括 , ;=,但如果参数包含任何引用的分隔符,它将失败。

    以下改进支持&|等带引号的特殊字符,但参数分隔符仍然存在问题。

    @echo off
    setlocal enableDelayedExpansion
    set args=%*
    for /f "tokens=1,2*" %%a in ("!args!") do (
      endlocal
      echo arg1=%%a  arg2=%%b  remainder=%%c
    )
    

    编辑 这是一个使用USEBACKQ的更简单的修改,可以达到同样的效果

    for /f "usebackq tokens=1,2*" %%a in ('%*') do echo arg1=%%a  arg2=%%b  remainder=%%c
    

    结束编辑

    不幸的是,真正通用的解决方案需要一个 GOTO 循环来解析从 3 开始的每个参数。只要所有引号都是平衡的并且所有特殊字符都被引用,下面的解决方案应该可以工作。

    @echo off
    setlocal
    set "args="
    :parseArgs
    set args=%args% %3
    shift /3
    if "%~3" neq "" goto :parseArgs
    if (%3) equ ("") goto :parseArgs
    echo arg1=%1  arg2=%2  remainder=%args%
    

    要消除所有限制,需要采取严厉措施 - 请参阅 How to receive even the strangest command line parameters?

    【讨论】:

      【解决方案3】:

      这可能是你想要的

      C:>help shift
      Changes the position of replaceable parameters in a batch file.
      
      SHIFT [/n]
      
      If Command Extensions are enabled the SHIFT command supports
      the /n switch which tells the command to start shifting at the
      nth argument, where n may be between zero and eight.  For example:
      
          SHIFT /2
      
      would shift %3 to %2, %4 to %3, etc. and leave %0 and %1 unaffected.
      

      【讨论】:

      • 但这在这里无济于事,因为 SHIFT 仅对参数 %1..%9 有效,但对 %* 无效。所以没有一种简单的方法可以在没有一些前缀参数的情况下获取所有参数
      猜你喜欢
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 2020-03-15
      • 2021-02-27
      相关资源
      最近更新 更多