有没有一种方法可以创建带有参数的CMD命令?

时间:2020-03-21 19:35:26

标签: batch-file cmd arguments command

我正在尝试在命令提示符下创建命令,但请像使用其他语言的函数那样使用参数。

例如,您可以在C:\ Windows \ System32文件夹中创建一个批处理文件,并在命令提示符下键入其名称并创建一个“命令”以执行该文件。但是,这非常简单,并且可以简单运行批处理文件中包含的所有内容。

我执行的命令称为toolbx,它在命令提示符下具有不同的有用快捷方式。但是,我想通过键入类似toolbx 1的代码来执行不同的工具。这就是它的样子。

toolbx [input received changing what tool you want to use] (e.g. 1)

在toolbx.bat

if %inputRecieved% == 1 goto 1

我不擅长解释,因此Python中的另一个示例可能是:

def functionWithArgs (tool)

执行为:

functionWithArgs(1)

另一个摘要:

我正在尝试使命令提示符中的命令与批处理文件一起使用

我希望批处理文件具有在运行命令时定义的参数(例如python示例),可以用作批处理文件中的变量。

提前谢谢!

4 个答案:

答案 0 :(得分:1)

今天是您的幸运日,Windows批处理文件实际上支持称为 命令行参数 的功能。这是您需要做的:

set inputRecieved=%1
if "%inputRecieved%"=="1" goto label1
goto :eof

:label1
   blabla...

编码愉快!

P.S。

请注意,单词的正确拼写是“已接收”,而不是“已接收”。

答案 1 :(得分:1)

假设您要在运行命令时使用参数,而不是批处理文件,除了简单地使用参数(%1起),您还有其他选择

选项包括函数,这些函数可以使用Call命令作为子例程,也可以采用宏的形式。另外,您可以创建一个循环以使用Set /P接受输入,并在输入经过验证后中断循环。

根据您的需要,您还可以构建一个例程来检查/从另一个文件获取输入。

Take a look here at an example program that utilises subroutines for some ideas.

Command参数的宏形式的示例,已修改为以列表形式输入以分配给Array(尽管列表上的其他动作同样可以)。

@Echo off 

    Setlocal DisableDelayedExpansion

    (Set LF=^


    %= NewLine =%)

    Set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
::: \

::: / Macro for recieving exceptionally large arguments
Set "Inc.Class=Set /A %%G+=1"
Set "Inc.Index=Set /A %%H+=1"

Endlocal & Set Define.Array=^&for /L %%n in (1 1 2) do if %%n==2 (%\n%
        For /F "tokens=1,2 delims=, " %%G in ("!argv!") do (%\n%
            %Inc.Class% %\n%
%= iterate over the tempVar for each argument to be processed =%
            For %%A in (!Args-In!) do (%\n%
%= Increment the count for the current array name =%
                %Inc.Index% %\n%
%= Assign the current arg to the current Array Index =%
                Set "%%G[!%%G!][!%%H!]=%%~A" %\n%
            ) %\n%
%= Store the Arg-In to reference list of all args for future reuse =%
            Set Ref_%%G[!%%G!]=!Args-In! %\n%
        ) %\n%
    ) ELSE set argv=, 
::: \

::: / Mini-Macro used in conjunction with Define.Array to Pseudo pipe complex strings into the Macro.
    Set "Params|=Set Args-In="
::: \

:main
::: / 'Switch on' Define.Array Macro in advance. This is in order to resolve the Setlocal recursion breach that occurs if Expansion is enabled within the macro.
    Setlocal enableDelayedExpansion
::: \

::: / Example usage of paired macro's
::: - Demonstrate definition fo linked element names to matrices
%Params|% "Object_A" "Object_B" "Object_C" "Object_D" %Define.Array% Class I1 
%Params|% "Object_E" "Object_F" "Object_G" "Object_H" %Define.Array% Element I2
%Params|% "Object_I" "Object_J" "Object_K" "Object_L" %Define.Array% Array I3
%Params|% "Object_M" "Object_N" "Object_O" "Object_P" %Define.Array% Variable I4
%Params|% "Object_Q" "Object_R" "Object_S" "Object_T" %Define.Array% Element I5
%Params|% "Object_U" "Object_V" "Object_W" "Object_X" %Define.Array% Array I6
%Params|% "Object_Y" "Object_Z" "Object_0" "Object_1" %Define.Array% Variable I7
%Params|% "Object_2" "Object_3" "Object_4" "Object_5" %Define.Array% Class I8
%Params|% "Object_6" "Object_7" "Object_8" "Object_9" %Define.Array% Element I9
::: - Demonstrate building values obtained during a for loop into a string to be fed into Define.Array
%Params|% & (For %%A in ("example of" "string building" "Using a For Loop" "^(If defined, the Reset of the Args-In Variable is required^)") do (%Params|%!Args-In! "%%~A")) %Define.Array% BuildString I10


::: Example of ways to Iterate over the Array values.
For %%A in (Class Element Array Variable BuildString) do (
    For /L %%C in (1,1,!%%A!) do (
%= subroutine builds a string containing all index values for later reuse by referring to the element and index names =%
        Set Ref_%%A[%%C]
%= I# allows a unique reference number for each array to iterate over that array with =%
        For /L %%I in (1,1,!I%%C!) do (
            If not "!%%A[%%C][%%I]!"=="" Set %%A[%%C][%%I]
        )
    Echo.
    )
    Echo.
)

For %%C in (Class Element Array Variable BuildString) do For /L %%E in (1,1,!%%C!) do For %%I in (!Ref_%%C[%%E]!) Do Echo %%~I

Pause >nul
Exit /B
::: \

这种向宏提供输入的方法绕过了For / F循环参数结构的令牌限制。它不会完全放弃结构,因为它对于为宏的输出提供返回变量很有用。为了避免破坏递归级别,在扩展宏之前先启用延迟扩展,然后从宏定义中删除启用延迟扩展的开关。

答案 2 :(得分:1)

您可以使用由 @jeb @dbenham 和DosTips用户 @Ed Dyreen 发明的macro style

定义:

@echo off
SETLOCAL DISABLEDELAYEDEXPANSION

::Definitions
( set LF=^
%= EMPTY =%
)
set ^"NL=^^^%LF%%LF%^%LF%%LF%^^"

整个目的是创建一个多行变量。参见batch newline variable hack

主宏:

::Macro
ENDLOCAL &^
set $MACRO.Toolbx=FOR %%a in (args main) do if "%%a" == "main" (%NL%
    for %%A in (%payload%) do (%NL%
        %= MAIN MACRO HERE, END LINES WITH NL =%%NL%
    )%NL%
) ELSE SETLOCAL ENABLEDELAYEDEXPANSION ^& set args=,

exit /b

将其另存为MACRO.Toolbx.bat。要在批处理文件中使用宏,请执行以下操作:

call MACRO.Toolbx.bat
%$MACRO.Toolbx% COMMAND_LINE_ARGS

宏使用聪明的FOR循环来“捕获”参数。另外,为了捕获参数,DISABLEDELAYEDEXPANSION是必需的,这与SETLOCAL是分不开的。但是,ENDLOCAL将破坏该范围内的所有用户定义的变量,但是我们需要换行符定义。因此,ENDLOCAL和宏定义必须 在同一行 。这种技术称为ENDLOCAL tunneling

答案 3 :(得分:0)

确定 [完整的路径和文件名] [Parameter1] [Parameter2] [and_so_on]

是一个空格,分隔可以用%1%2%3 ...扩展的参数。

您可以分别使用%*扩展所有参数或最多扩展9个参数 例如:

%windir%\system32\toolbx.cmd Tool_1

请注意传递的参数beign是:Tool_1

在下面的示例中,

在行2处使用良性,其中%1展开:Tool_1

setlocal EnableDelayedExpansion
set tool=%1
set argument_1=Have
set argument_2=a
set argument_3=Nice
set argument_4=Day
CALL :Function_%tool% argument_1 argument_2 argument_3 argument_4
:: after Function_Tool_1 ends by reading the next GOTO :EOF after its Label,
:: will return to read instructions after this line
::
pause&&exit
::
:Function_Tool_1
echo. %argument_1% %argument_2% %argument_3% %argument_4% 
goto :EOF
::
::

注意:

使用CALL调用标签时,例如,必须使用冒号:

CALL :YourLabel

在标签之后,所有参数或参数用空格分隔 例如:

CALL :YourLabel param1 param2 param3 parampampam etc

我认为标签的语法与变量的语法相同。

您必须使用GOTO:EOF结束功能或过程

例如,使用GOTO转到标签时,请不要使用冒号:

GOTO YourLabel

但是使用CALL时有所不同,这可以更好地键入:

EXIT /?

GOTO /?

&用于分隔指令

&&用于将批处理文件中的指令分隔为toolbx.cmd

还要注意上面的示例: 函数中的%1%2%3和%4可以扩展变量名称,例如:

echo. %1 %2 %3 %4

会回声:argument_1argument_2argument_3argument_4

并使用SETLOCAL EnableDelayedExpansion

!%1!可以扩展变量的值,例如:

echo. !%1! !%2! !%3! !%4!

会回声:祝你有美好的一天