【问题标题】:Is it possible to have my own named parameters when running a batch file? [duplicate]运行批处理文件时是否可以拥有我自己的命名参数? [复制]
【发布时间】:2017-12-14 14:41:19
【问题描述】:

我想知道在运行批处理文件时是否可以使用我自己的命名参数。

例如,我有一个 deploy.bat,我想从我的命令行中调用它,例如,我使用双破折号还是单破折号都没关系:

C:\> deploy.bat --user=admin --password=1234

这可能吗?

【问题讨论】:

  • 关于上面链接的重复问题,请特别注意this answer,因为它给出了一个相当优雅的解决方案。

标签: batch-file


【解决方案1】:

这里有两种方法(其他方法也是可能的),假设参数与问题中的相同:

@echo off
:: mind that '=' will be taken as blank space when parsing arguments.
:: and `--user=admin` are two arguments.

:: 1) with for /l
setlocal enableDelayedExpansion
rem max count of the expected arguments
set max_count=10


for /l %%# in (1,2,%max_count%) do (
    set /a next=%%#+1
    set curr=%%#
    call set "%%~!curr!=%%~!next!" 2>nul
)
echo %--user% -- %--password%

:::::::::::::::::
:: 2) processing the arguments line
setlocal enableDelayedExpansion
set "prev="
set "current="



for %%a in (%*) do (
    set "current=%%~a"
    if  defined prev (
        set "!prev!=%%~a"
        set "prev="
    ) else (
        set prev=%%a
    )
)

echo %--user% -- %--password%

解释: 通过这两种方式,我正在通过一种方式处理论点。此外,= 符号是 cmd.exe 的标准分隔符,它将被视为空格。

1) 在第一种方法中,我使用FOR /L 循环处理所有参数(它的作用类似于类 c 语法语言中的 for 循环)和步骤 2,并且在每个步骤中我还有下一个数字。在延迟扩展我可以参数化参数的数量并像call echo %%~!number! 一样得到它,这允许我使用参数-值对来设置变量。一个障碍是您不能以这种方式处理超过 9 个参数(或者您必须在循环中的某处添加 shift

2) 在第二个中,我正在处理整个参数行。我有一个附加变量 prev 在每个偶数步骤中被删除,在每个奇数步骤中,它采用当前参数的值。所以在每个甚至一步我都有参数-值对。

【讨论】:

  • 太棒了。非常感谢。这实际上完成了工作。我可以对上述解决方案进行解释吗?
  • @Panagiotis - 检查我的编辑。
  • 全部清除。非常感谢。
【解决方案2】:

批处理文件仅支持位置参数,地址为%1%2 等。如果您想进行手动解析字符串的练习 - 可能,但不是简单的练习 - 您可以模拟这个,但这可能不值得。

PowerShell 是一个更丰富的脚本环境,并且支持命名参数。

【讨论】:

    猜你喜欢
    • 2012-02-06
    • 2023-04-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2018-08-11
    • 2023-03-11
    相关资源
    最近更新 更多