运行批处理文件时是否可以拥有自己的命名参数?

时间:2017-12-14 14:41:19

标签: batch-file

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

例如,我有一个deploy.bat,我想从我的命令行调用它,如果我将使用双击或单用短划线无关紧要:

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

这可能吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

@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在每个偶数步骤被删除,在每个奇数步骤上它取当前参数的值在每个偶数步骤中,我都有参数值。