【问题标题】:Read parameters using variables使用变量读取参数
【发布时间】:2019-09-21 15:36:26
【问题描述】:

我在读取已添加到子例程的参数时遇到问题。这些参数当然可以通过以下方式读取。

call :test one two three

:test
    echo %1
    echo %2
    echo %3
exit /b

但我想循环阅读,只要它们被填满。

我为此做了以下操作,但我没有让它正常工作。 以我对这一切的有限了解。我通常会在 3 个点上请求一个变量。所以%p%。

call :test one two three

:test
    set /a p=1

    :while
    if [%...] NEQ [] (
        echo %...
        set /a p=p+1
    goto :while
    )
exit /b

谁能告诉我如何解决这个问题?

【问题讨论】:

  • 您需要shft 命令。
  • 或者如果只是逐行回显参数,则在:test 子例程中只需要for %%a in (%*) do echo %%a(其中%* 是“所有参数”的列表)
  • 这肯定是一个重复的问题,但我太累了,无法找到一个有好的答案。
  • 您需要在call 命令行后面加上exit /B,以免无意中继续执行...

标签: batch-file variables parameters arguments


【解决方案1】:

感谢@Stephan。它就像我想要的那样工作:

:test
for %%A in (%*) do (
    echo %%A
)
exit /b

【讨论】:

  • 请接受解决了您的问题的答案(即使是您自己的问题),以便从“未回答”队列中删除此问题。
【解决方案2】:
@ECHO OFF
SETLOCAL
call :test one two three
call :test four five
call :test seven eight nine ten
CALL :test
goto :eof

:test
rem for /f "delims==" %%a in ('set parm 2^>nul') do set "%%a="
set /a parmcnt=0
:testlp
set /a parmcnt+=1
SET "parm%parmcnt%=%1"
SHIFT
IF DEFINED parm%parmcnt% GOTO testlp
SET /a parmcnt-=1
ECHO %parmcnt% parameters
IF %parmcnt% gtr 0 FOR /L %%a IN (1,1,%parmcnt%) DO CALL ECHO %%parm%%a%%
ECHO -------------------
SET parm
ECHO ===================
GOTO :EOF

这里的重点是:testlp 循环。参数计数parmcnt 递增,变量parm... 设置为%1 - 第一个参数,然后参数列表为SHIFTed,它只是从明显列表中删除第一个参数。

如果parm... 有值,则重试,直到所有参数都已分配给parm*

减少参数计数(因为上次分配尝试分配了 nothing 的值,因为 %1 不存在)并显示结果。

结果显示分为两部分。第一个使用解析技巧(避免delayed expansion 这是一个全新的球类游戏)。解析器首先替换 元变量 %%a,因此执行的是 call echo %%parm1%% 等,将 1 替换为 %parmcnt%calling echo 在子shell 中执行echo %parm1%

第二个只是显示所有以parm 开头的变量set。请注意,parm%parmcnt+1% 将始终为空,但之前调用 :test 时可能会设置杂散的 parms

因此删除了for ... set parm 行,它清除了从parm 开始的所有变量。从此行中删除 rem 将解决杂散变量问题,但请注意,它还会清除任何以 parm 开头的变量名 - 就像设置了 parmlimitparmlimit 一样。

【讨论】:

  • 我喜欢@stephan 的for %%a in (%*) do echo %%a 建议。这是对 OP 问题的更简单、更直接的答案。
猜你喜欢
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2023-02-02
  • 2016-01-24
  • 1970-01-01
相关资源
最近更新 更多