Batch file 有没有办法创建带有参数的CMD命令?

Batch file 有没有办法创建带有参数的CMD命令?,batch-file,cmd,arguments,command,Batch File,Cmd,Arguments,Command,我试图在命令提示符下创建一个命令,但要像使用另一种语言的函数一样使用参数 例如,您可以在C:\Windows\System32文件夹中创建一个批处理文件,并在命令提示符下通过键入其名称、创建命令来执行该文件。不过,这非常简单,只需运行批处理文件包含的任何内容 我的命令名为toolbx,它在命令提示符中有不同的有用快捷方式。但是,我想通过键入类似toolbx1的内容来执行不同的工具。下面是它可能的样子 toolbx[收到的输入更改了您想要使用的工具]例如1 在toolbx.bat中 如果%inpu

我试图在命令提示符下创建一个命令,但要像使用另一种语言的函数一样使用参数

例如,您可以在C:\Windows\System32文件夹中创建一个批处理文件,并在命令提示符下通过键入其名称、创建命令来执行该文件。不过,这非常简单,只需运行批处理文件包含的任何内容

我的命令名为toolbx,它在命令提示符中有不同的有用快捷方式。但是,我想通过键入类似toolbx1的内容来执行不同的工具。下面是它可能的样子

toolbx[收到的输入更改了您想要使用的工具]例如1

在toolbx.bat中

如果%inputRecieved%==1转到1

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

def functionWithArgs工具

执行日期:

带有args1的函数

作为另一个总结:

我正在尝试使用批处理文件生成命令提示符中使用的命令

我希望批处理文件在运行命令时定义参数,就像python示例一样,可以在批处理文件中用作变量


提前谢谢你

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

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

:label1
   blabla...
享受编码的乐趣

附言


请注意,该单词的正确拼写已收到,而未收到。

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

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

:label1
   blabla...
享受编码的乐趣

附言


请注意,该词的正确拼写已收到,而未收到。

已开发了一种使用for循环的技术,该技术允许在展开变量时捕获参数-批处理宏

使用外部for循环,该循环在第一次迭代时分配一个包含参数值的变量,内部循环处理并对这些值执行操作

@echo off
Set "Macroname=For %%n in (1 2)Do if %%n==2 (Echo(!Args!)Else Set args="
Setlocal EnableDelayedExpansion
%Macroname% Hello World
该技术要求在禁用延迟扩展的环境中定义宏变量,然后使用Setlocal EnableDelayedExpansion启用宏。当然,除非所有人!在启用延迟扩展的环境的宏定义期间,扩展符号被正确转义

下面是批处理宏的模板,用于构建Args数组和跟踪参数的进程开关。模板的目的是通过准备好所有参数和开关处理逻辑,允许快速编写高级函数的脚本,这样函数的内容就是需要编写脚本的全部内容

参数返回到数组$Macroname\u Args[!$Macroname\u Args[i]!],其中: !$宏名称_args[i]!参数的索引计数为0。 使用开关字符串作为索引,在关联变量中返回开关,即: %宏名称%/A 结果:$宏名称_开关[A]==符合事实的 或者,如果提供了斯巴克: %宏名称%/A子参数 结果:$宏名称_开关[A]==子参数

宏使用子字符串修改将开关与参数和进程开关分离。 因此,arg或开关值包含以下字符: = * / 应以替代形式提供: {EQ}{AS}{FS}{DQ},使用宏中内置的替换替换

@回音 设置\n=^^^ %=\n宏换行符变量。不修改=% 设置LF=^ %=LF换行符变量。不修改=% :用于演示概念的示例开关。在宏开关处理中使用了两次的列表。将外部宏定义为 :简化维护。 设置$MacroName_开关=A B C D E Def 如果%%n==2%\n% 对于/F标记=1,2 Delims==%%G在'Set$Macroname_Arg[2^^^>nul'Do Set%%~G=%\n% 对于%%G in%$MacroName\u开关%Do设置$MacroName\u开关[%%~G]=%\n% 如果不是!$MacroName\u args://=!=!$MacroName\u args!%\n:如果存在args,则生成$MacroName.args[!$MacroName\u arg[i]!]数组=% 设置$MacroName\u leading.args=!$MacroName\u args://=!%\n% 对于/F Delims=%%G in!$MacroName\u leading.args!请设置$MacroName\u leading.args=!$MacroName\u args:/%%G=!%\n% 设置^$MacroName\u参数=!$MacroName\u参数:=!%\n% 设置$MacroName\u arg[i]=0%\n% 对于%%G in!$MacroName\u leading.args!Do%\n% Set/A$MacroName\u arg[i]+=1%\n% 设置$MacroName\u arg[!$MacroName\u arg[i]!]=%%~G%\n% 对于%%i in!$MacroName\u arg[i]!Do%\n% 设置$MacroName_arg[%%~i]=!$MacroName_arg[%%~i]:{FS}=/!%\n% 设置$MacroName_arg[%%~i]=!$MacroName_arg[%%~i]:{AS}=*!%\n% 设置$MacroName_arg[%%~i]=!$MacroName_arg[%%~i]:{EQ}==!%\n% 设置^$MacroName_arg[%%~i]=!$MacroName_arg[%%~i]:{DQ}=!%\n% %\n% %\n% Else%\n:在开关处理开关之前从参数中删除双引号=% 设置^$MacroName\u参数=!$MacroName\u参数:=!%\n% %\n% 设置$MacroName\u LastSwitch=%\n% 对于/L%%L in 2 1 4Do If!$MacroName\u LastSwitch!==%\n% 如果!$MacroName\u参数:~-%%L,1!==设置$MacroName\u LastSwitch=\u%\ n% 如果$宏名称参数:~-%%L,1!==/%\n:如果没有子分组,则标记最后一个开关为真;适用于最多3个字符的字符切换=% 对于/F Delims=%%v在'Set/A%%L-1'中设置$MacroName\u开关[!$MacroName\u参数:~-%%v!]=true%\n% 如果不是$宏名称参数:/?=!。=$宏名称_Args!。设置$MacroName\u开关[help]=true%\n% 设置$MacroName\u Args=$宏名称参数:~0,-%%L!%\n% 设置$MacroName\u LastSwitch=\u%\n% %\n% %\n% 对于%%G in%$MacroName\u开关,如果没有,请执行%$宏名称参数:/%%~G=!=$宏名称_参数!%\n% 设置$MacroName\u开关[%%~G]=$宏名称参数:/%%~G=!%\n% 如果不是$宏名称_开关[%%~G]:*/=!=$宏名称_开关[%%~G]!%\n% 设置$MacroName\u Trail[%%~G]=$宏名称_开关[%%~G]:*/=!%\n% 对于%%v英寸$宏名称\u Trail[%%~G]!Do%\n% 设置$MacroName\u开关[%%~G]=$宏名称_开关[%%~G]:/%%~v=!%\n% 设置$MacroName\u开关[%%~G]=$宏名称_开关[%%~G]:/%%~v=!%\n% %\n% 设置$MacroName\u Trail[%%~G]=%\n% 如果$宏名称\u开关[%%~G]:~-1!==设置$MacroName\u开关[%%~G]=$宏名称_开关[%%~G]:~0,-1!%\n% 如果$宏名称_开关[%%~G]!==设置$MacroName\u开关[%%~G]=true%\n% 如果不是$宏名称_开关[%%~G]!==如果不是$宏名称_开关[%%~G]!==正确%\n% 设置$MacroName\u开关[%%~G]=$宏名称_开关[%%~G]:{FS}=/!%\n% 设置$MacroName\u开关[%%~G]=$宏名称_开关[%%~G]:{AS}=*!%\n% 设置$MacroName\u开关[%%~G]=$宏名称_开关[%%~G]:{EQ}==!%\n% 设置^$MacroName_开关[%%~G]=$宏名称_开关[%%~G]:{DQ}=!%\n% %\n% %\n% %\n:在下面插入开关评估。在$MacroName_args赋值=%之前,使用有效开关的条件测试来执行宏函数 REM INSERT命令位于上下两行之间,以变量%\n%终止每一行 %=示例。删除此行。=%回响如果!示例:%%$Macroname%%$宏名称_参数!%\n% %=示例。删除此行。=%设置$Macroname\u参数[%\n% %=示例。删除此行。=%Set$Macroname\u开关[%\n% %=宏定义期间转义符号和重定向字符。=%Else设置$MacroName\u参数= Setlocal enableDelayedExpansion :概念证明 %$Macroname%{AS}param 1{EQ}{DQ}https:{FS}{FS}stackoverflow.com{FS}posts{FS}60793679{DQ}param 2/C one/D 12/Def %$Macroname%/B a B/E/Def hello world&^!><|%/a 1+2{EQ}3/未定义开关
使用for循环开发了一种技术,该技术允许在展开变量时捕获参数—批处理宏

使用外部for循环,该循环在第一次迭代时分配一个包含参数值的变量,内部循环处理并对这些值执行操作

@echo off
Set "Macroname=For %%n in (1 2)Do if %%n==2 (Echo(!Args!)Else Set args="
Setlocal EnableDelayedExpansion
%Macroname% Hello World
该技术要求在禁用延迟扩展的环境中定义宏变量,然后使用Setlocal EnableDelayedExpansion启用宏。当然,除非在启用延迟扩展的环境的宏定义过程中正确转义了所有!扩展符号

下面是批处理宏的模板,该模板用于构建Args数组并处理跟踪参数的开关。该模板的目的是通过准备好所有参数和开关处理逻辑,允许快速编写高级函数的脚本,以便只需编写函数的内容

参数返回到数组$Macroname\u Args[!$Macroname\u Args[i]!],其中: !$Macroname_args[i]!是一个索引为0的args计数。 使用开关字符串作为索引,在关联变量中返回开关,即: %宏名称%/A 结果为:!$Macroname\u开关[A]!==true 或者,如果提供了斯巴克: %宏名称%/A子参数 结果为:!$Macroname\u开关[A]!==子参数

宏使用子字符串修改将开关与参数和进程开关分离。 因此,arg或开关值包含以下字符: = * / 应以替代形式提供: {EQ}{AS}{FS}{DQ},使用宏中内置的替换替换

@回音 设置\n=^^^ %=\n宏换行符变量。不修改=% 设置LF=^ %=LF换行符变量。不修改=% :用于演示概念的开关示例。在宏开关处理中使用了两次的列表。将外部宏定义为 :简化维护。 设置$MacroName_开关=A B C D E Def 如果%%n==2%\n% 对于/F标记=1,2 Delims==%%G在'Set$Macroname_Arg[2^^^>nul'Do Set%%~G=%\n% 对于%%G in%$MacroName\u开关%Do设置$MacroName\u开关[%%~G]=%\n% 如果不是!$MacroName\u args://=!=!$MacroName\u args!%\n:如果存在args,则生成$MacroName.args[!$MacroName\u arg[i]!]数组=% 设置$MacroName\u leading.args=!$MacroName\u args://=!%\n% 对于/F Delims=%%G in!$MacroName\u leading.args!请设置$MacroName\u leading.args=!$MacroName\u args:/%%G=!%\n% 设置^$MacroName\u参数=!$MacroName\u参数:=!%\n% 设置$MacroName\u arg[i]=0%\n% 对于%%G in!$MacroName\u leading.args!Do%\n% Set/A$MacroName\u arg[i]+=1%\n% 设置$MacroName\u arg[!$MacroName\u arg[i]!]=%%~G%\n% 对于%%i in!$MacroNam e_arg[i]!Do%\n% 设置$MacroName_arg[%%~i]=$宏名称_arg[%%~i]:{FS}=/!%\n% 设置$MacroName_arg[%%~i]=$宏名称_arg[%%~i]:{AS}=*!%\n% 设置$MacroName_arg[%%~i]=$宏名称_arg[%%~i]:{EQ}==!%\n% 设置^$MacroName\u arg[%%~i]=$宏名称_arg[%%~i]:{DQ}=!%\n% %\n% %\n% Else%\n:在开关处理开关之前从参数中删除双引号=% 设置^$MacroName_args=$宏名称参数:=!%\n% %\n% 设置$MacroName\u LastSwitch=%\n% 对于/L%%L,在2 1 4Do中如果$宏名称\u LastSwitch!==%\n% 如果$宏名称参数:~-%%L,1!==设置$MacroName\u LastSwitch=\u%\n% 如果$宏名称参数:~-%%L,1!==/%\n:如果没有子分组,则标记最后一个开关为真;适用于最多3个字符的字符切换=% 对于/F Delims=%%v在'Set/A%%L-1'中设置$MacroName\u开关[!$MacroName\u参数:~-%%v!]=true%\n% 如果不是$宏名称参数:/?=!。=$宏名称_Args!。设置$MacroName\u开关[help]=true%\n% 设置$MacroName\u Args=$宏名称参数:~0,-%%L!%\n% 设置$MacroName\u LastSwitch=\u%\n% %\n% %\n% 对于%%G in%$MacroName\u开关,如果没有,请执行%$宏名称参数:/%%~G=!=$宏名称_参数!%\n% 设置$MacroName\u开关[%%~G]=$宏名称参数:/%%~G=!%\n% 如果不是$宏名称_开关[%%~G]:*/=!=$宏名称_开关[%%~G]!%\n% 设置$MacroName\u Trail[%%~G]=$宏名称_开关[%%~G]:*/=!%\n% 对于%%v英寸$宏名称\u Trail[%%~G]!Do%\n% 设置$MacroName\u开关[%%~G]=$宏名称_开关[%%~G]:/%%~v=!%\n% 设置$MacroName\u开关[%%~G]=$宏名称_开关[%%~G]:/%%~v=!%\n% %\n% 设置$MacroName\u Trail[%%~G]=%\n% 如果$宏名称\u开关[%%~G]:~-1!==设置$MacroName\u开关[%%~G]=$宏名称_开关[%%~G]:~0,-1!%\n% 如果$宏名称_开关[%%~G]!==设置$MacroName\u开关[%%~G]=true%\n% 如果不是$宏名称_开关[%%~G]!==如果不是$宏名称_开关[%%~G]!==正确%\n% 设置$MacroName\u开关[%%~G]=$宏名称_开关[%%~G]:{FS}=/!%\n% 设置$MacroName\u开关[%%~G]=$宏名称_开关[%%~G]:{AS}=*!%\n% 设置$MacroName\u开关[%%~G]=$宏名称_开关[%%~G]:{EQ}==!%\n% 设置^$MacroName_开关[%%~G]=$宏名称_开关[%%~G]:{DQ}=!%\n% %\n% %\n% %\n:在下面插入开关评估。在$MacroName_args赋值=%之前,使用有效开关的条件测试来执行宏函数 REM INSERT命令位于上下两行之间,以变量%\n%终止每一行 %=示例。删除此行。=%回响如果!示例:%%$Macroname%%$宏名称_参数!%\n% %=示例。删除此行。=%设置$Macroname\u参数[%\n% %=示例。删除此行。=%Set$Macroname\u开关[%\n% %=宏定义期间转义符号和重定向字符。=%Else设置$MacroName\u参数= Setlocal enableDelayedExpansion :概念证明 %$Macroname%{AS}param 1{EQ}{DQ}https:{FS}{FS}stackoverflow.com{FS}posts{FS}60793679{DQ}param 2/C one/D 12/Def %$Macroname%/B a B/E/Def hello world&^!><|%/a 1+2{EQ}3/未定义开关 您可以使用@jeb、@dbenham和DosTips用户@Ed Dyreen发明的:

定义:

@echo off
SETLOCAL DISABLEDELAYEDEXPANSION

::Definitions
( set LF=^
%= EMPTY =%
)
set ^"NL=^^^%LF%%LF%^%LF%%LF%^^"
其全部目的是创建一个多行变量

主要宏:

::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和宏定义必须在同一行。这种技术叫做。

你可以使用@jeb、@dbenham和DosTips用户@Ed Dyreen发明的:

定义:

@echo off
SETLOCAL DISABLEDELAYEDEXPANSION

::Definitions
( set LF=^
%= EMPTY =%
)
set ^"NL=^^^%LF%%LF%^%LF%%LF%^^"
其全部目的是创建一个多行变量

主要宏:

::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和宏定义必须在同一行。这种技术叫做。

当然 [完整路径和文件名][Parameter1][Parameter2][和\u so\u on]

是一个分隔可以用%1%2%3展开的参数的空间

您可以使用%*或最多9个参数单独展开所有参数 例如:

%windir%\system32\toolbx.cmd Tool_1
CALL :YourLabel
CALL :YourLabel param1 param2 param3 parampampam etc
GOTO YourLabel
echo. %1 %2 %3 %4
echo. !%1! !%2! !%3! !%4!
注:传递的参数为:刀具_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
::
::
注:

使用呼叫到呼叫标签时,必须使用冒号,例如:

%windir%\system32\toolbx.cmd Tool_1
CALL :YourLabel
CALL :YourLabel param1 param2 param3 parampampam etc
GOTO YourLabel
echo. %1 %2 %3 %4
echo. !%1! !%2! !%3! !%4!
在标签后面,所有参数或参数用空格分隔 例如:

%windir%\system32\toolbx.cmd Tool_1
CALL :YourLabel
CALL :YourLabel param1 param2 param3 parampampam etc
GOTO YourLabel
echo. %1 %2 %3 %4
echo. !%1! !%2! !%3! !%4!
我认为标签的语法与变量的语法相同

您必须使用GOTO:EOF来结束函数或过程

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

%windir%\system32\toolbx.cmd Tool_1
CALL :YourLabel
CALL :YourLabel param1 param2 param3 parampampam etc
GOTO YourLabel
echo. %1 %2 %3 %4
echo. !%1! !%2! !%3! !%4!
但是w 如果使用CALL是不同的,则更好地输入说明如下:

EXIT /?

GOTO /?
&用于分隔指令

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

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

%windir%\system32\toolbx.cmd Tool_1
CALL :YourLabel
CALL :YourLabel param1 param2 param3 parampampam etc
GOTO YourLabel
echo. %1 %2 %3 %4
echo. !%1! !%2! !%3! !%4!
将回显:参数\u 1参数\u 2参数\u 3参数\u 4

并使用SETLOCAL EnableDelayedExpansion

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

%windir%\system32\toolbx.cmd Tool_1
CALL :YourLabel
CALL :YourLabel param1 param2 param3 parampampam etc
GOTO YourLabel
echo. %1 %2 %3 %4
echo. !%1! !%2! !%3! !%4!
愿回声:祝你有愉快的一天

当然 [完整路径和文件名][Parameter1][Parameter2][和\u so\u on]

是一个分隔可以用%1%2%3展开的参数的空间

您可以使用%*或最多9个参数单独展开所有参数 例如:

%windir%\system32\toolbx.cmd Tool_1
CALL :YourLabel
CALL :YourLabel param1 param2 param3 parampampam etc
GOTO YourLabel
echo. %1 %2 %3 %4
echo. !%1! !%2! !%3! !%4!
注:传递的参数为:刀具_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
::
::
注:

使用呼叫到呼叫标签时,必须使用冒号,例如:

%windir%\system32\toolbx.cmd Tool_1
CALL :YourLabel
CALL :YourLabel param1 param2 param3 parampampam etc
GOTO YourLabel
echo. %1 %2 %3 %4
echo. !%1! !%2! !%3! !%4!
在标签后面,所有参数或参数用空格分隔 例如:

%windir%\system32\toolbx.cmd Tool_1
CALL :YourLabel
CALL :YourLabel param1 param2 param3 parampampam etc
GOTO YourLabel
echo. %1 %2 %3 %4
echo. !%1! !%2! !%3! !%4!
我认为标签的语法与变量的语法相同

您必须使用GOTO:EOF来结束函数或过程

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

%windir%\system32\toolbx.cmd Tool_1
CALL :YourLabel
CALL :YourLabel param1 param2 param3 parampampam etc
GOTO YourLabel
echo. %1 %2 %3 %4
echo. !%1! !%2! !%3! !%4!
但如果使用CALL不同,则更好地输入:

EXIT /?

GOTO /?
&用于分隔指令

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

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

%windir%\system32\toolbx.cmd Tool_1
CALL :YourLabel
CALL :YourLabel param1 param2 param3 parampampam etc
GOTO YourLabel
echo. %1 %2 %3 %4
echo. !%1! !%2! !%3! !%4!
将回显:参数\u 1参数\u 2参数\u 3参数\u 4

并使用SETLOCAL EnableDelayedExpansion

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

%windir%\system32\toolbx.cmd Tool_1
CALL :YourLabel
CALL :YourLabel param1 param2 param3 parampampam etc
GOTO YourLabel
echo. %1 %2 %3 %4
echo. !%1! !%2! !%3! !%4!

祝你有愉快的一天

键入set/?打电话给/?和cmd/?寻求帮助。您可以使用,但似乎您要查找的是。键入set/?打电话给/?和cmd/?寻求帮助。你可以使用,但看起来你需要的是。谢谢!我完全没有注意到这个错误的拼写。我将进一步研究命令行参数。谢谢!我完全没有注意到这个错误的拼写。我将进一步研究命令行参数。