如何将参数传递给批处理文件?_批处理 传递参数-程序员宅基地

技术标签: batch-file  arguments  

我需要在运行时将ID和密码传递给批处理文件,而不是将其硬编码为文件。

命令行如下所示:

test.cmd admin P@55w0rd > test-log.txt

#1楼

无需使其复杂化。 例如,它只是命令%1%2的参数,

@echo off

xcopy %1 %2 /D /E /C /Q /H /R /K /Y /Z

echo copied %1 to %2

pause

“暂停”显示批处理文件已完成的操作,并等待您按ANY键。 将其另存为Windows文件夹中的xx.bat。

要使用它,请键入,例如:

xx c:\f\30\*.* f:\sites\30

该批处理文件处理所有必要的参数,例如仅复制文件,更新文件等。自Windows之前我就使用它。 如果要查看正在复制的文件名,请省略Q参数。


#2楼

要在命令行中引用set变量,您将需要使用%a%这样,例如:

set a=100 
echo %a%  
rem output = 100 

注意:这适用于Windows 7专业版。


#3楼

@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
SHIFT
GOTO Loop
:Continue

注意:如果将%1括在引号本身中,则如果"%1"==""会引起问题。

在这种情况下,请使用IF [%1]==[]或者仅在NT 4(SP6)和更高版本中使用IF "%~1"==""


#4楼

是的,只是在使用iffor和gang时不要忘记使用%%1类的变量。

如果您忘记了双精度% ,那么您将用(可能为null)命令行参数替换,并且会收到一些非常令人困惑的错误消息。


#5楼

另一个有用的技巧是使用%*表示“全部”。 例如:

echo off
set arg1=%1
set arg2=%2
shift
shift
fake-command /u %arg1% /p %arg2% %*

运行时:

test-command admin password foo bar

上面的批处理文件将运行:

fake-command /u admin /p password admin password foo bar

我的语法可能有些错误,但这是一般的想法。


#6楼

如果要智能处理丢失的参数,可以执行以下操作:

IF %1.==. GOTO No1
IF %2.==. GOTO No2
... do stuff...
GOTO End1

:No1
  ECHO No param 1
GOTO End1
:No2
  ECHO No param 2
GOTO End1

:End1

#7楼

FOR %%A IN (%*) DO (
    REM Now your batch file handles %%A instead of %1
    REM No need to use SHIFT anymore.
    ECHO %%A
)

这会循环引用或不引用批处理参数(%*),然后回显每个参数。


#8楼

让我们保持简单。

这是.cmd文件。

@echo off
rem this file is named echo_3params.cmd
echo %1
echo %2
echo %3
set v1=%1
set v2=%2
set v3=%3
echo v1 equals %v1%
echo v2 equals %v2%
echo v3 equals %v3%

这是从命令行进行的3个调用。

C:\Users\joeco>echo_3params 1abc 2 def  3 ghi
1abc
2
def
v1 equals 1abc
v2 equals 2
v3 equals def

C:\Users\joeco>echo_3params 1abc "2 def"  "3 ghi"
1abc
"2 def"
"3 ghi"
v1 equals 1abc
v2 equals "2 def"
v3 equals "3 ghi"

C:\Users\joeco>echo_3params 1abc '2 def'  "3 ghi"
1abc
'2
def'
v1 equals 1abc
v2 equals '2
v3 equals def'

C:\Users\joeco>

#9楼

我编写了一个简单的read_params脚本,可以将其称为函数(或外部.bat ),并将所有变量放入当前环境中。 它不会修改原始参数,因为正在使用原始参数的副本call该函数。

例如,给出以下命令:

myscript.bat some -random=43 extra -greeting="hello world" fluff

myscript.bat将能够在调用函数后使用变量:

call :read_params %*

echo %random%
echo %greeting%

功能如下:

:read_params
if not %1/==/ (
    if not "%__var%"=="" (
        if not "%__var:~0,1%"=="-" (
            endlocal
            goto read_params
        )
        endlocal & set %__var:~1%=%~1
    ) else (
        setlocal & set __var=%~1
    )
    shift
    goto read_params
)
exit /B

局限性

  • 无法加载没有值的参数,例如-force 。 您可以使用-force=true但是我想不了一种方法来允许空白值,而无需提前知道没有值的参数列表。

变更日志

  • 2016/2/18
    • 不再需要延迟扩展
    • 现在可以通过在参数之前查找-与其他命令行参数一起使用。

#10楼

最近有一个朋友问我有关此主题的信息,所以我认为我应该发布如何处理批处理文件中的命令行参数。

如您所见,该技术会产生一些开销,但是它使我的批处理文件非常容易理解和快速实现。 以及支持以下结构:

>template.bat [-f] [--flag] [/f] [--namedvalue value] arg1 [arg2][arg3][...]

它的关键是具有:init:parse:main函数。

用法示例

>template.bat /?
test v1.23
This is a sample batch file template,
providing command-line arguments and flags.

USAGE:
test.bat [flags] "required argument" "optional argument"

/?, --help           shows this help
/v, --version        shows the version
/e, --verbose        shows detailed output
-f, --flag value     specifies a named parameter value

>template.bat          <- throws missing argument error
(same as /?, plus..)
****                                   ****
****    MISSING "REQUIRED ARGUMENT"    ****
****                                   ****

>template.bat -v
1.23

>template.bat --version
test v1.23
This is a sample batch file template,
providing command-line arguments and flags.

>template.bat -e arg1
**** DEBUG IS ON
UnNamedArgument:    "arg1"
UnNamedOptionalArg: not provided
NamedFlag:          not provided

>template.bat --flag "my flag" arg1 arg2
UnNamedArgument:    "arg1"
UnNamedOptionalArg: "arg2"
NamedFlag:          "my flag"

>template.bat --verbose "argument #1" --flag "my flag" second
**** DEBUG IS ON
UnNamedArgument:    "argument #1"
UnNamedOptionalArg: "second"
NamedFlag:          "my flag"

template.bat

@::!/dos/rocks
@echo off
goto :init

:header
    echo %__NAME% v%__VERSION%
    echo This is a sample batch file template,
    echo providing command-line arguments and flags.
    echo.
    goto :eof

:usage
    echo USAGE:
    echo   %__BAT_NAME% [flags] "required argument" "optional argument" 
    echo.
    echo.  /?, --help           shows this help
    echo.  /v, --version        shows the version
    echo.  /e, --verbose        shows detailed output
    echo.  -f, --flag value     specifies a named parameter value
    goto :eof

:version
    if "%~1"=="full" call :header & goto :eof
    echo %__VERSION%
    goto :eof

:missing_argument
    call :header
    call :usage
    echo.
    echo ****                                   ****
    echo ****    MISSING "REQUIRED ARGUMENT"    ****
    echo ****                                   ****
    echo.
    goto :eof

:init
    set "__NAME=%~n0"
    set "__VERSION=1.23"
    set "__YEAR=2017"

    set "__BAT_FILE=%~0"
    set "__BAT_PATH=%~dp0"
    set "__BAT_NAME=%~nx0"

    set "OptHelp="
    set "OptVersion="
    set "OptVerbose="

    set "UnNamedArgument="
    set "UnNamedOptionalArg="
    set "NamedFlag="

:parse
    if "%~1"=="" goto :validate

    if /i "%~1"=="/?"         call :header & call :usage "%~2" & goto :end
    if /i "%~1"=="-?"         call :header & call :usage "%~2" & goto :end
    if /i "%~1"=="--help"     call :header & call :usage "%~2" & goto :end

    if /i "%~1"=="/v"         call :version      & goto :end
    if /i "%~1"=="-v"         call :version      & goto :end
    if /i "%~1"=="--version"  call :version full & goto :end

    if /i "%~1"=="/e"         set "OptVerbose=yes"  & shift & goto :parse
    if /i "%~1"=="-e"         set "OptVerbose=yes"  & shift & goto :parse
    if /i "%~1"=="--verbose"  set "OptVerbose=yes"  & shift & goto :parse

    if /i "%~1"=="--flag"     set "NamedFlag=%~2"   & shift & shift & goto :parse

    if not defined UnNamedArgument     set "UnNamedArgument=%~1"     & shift & goto :parse
    if not defined UnNamedOptionalArg  set "UnNamedOptionalArg=%~1"  & shift & goto :parse

    shift
    goto :parse

:validate
    if not defined UnNamedArgument call :missing_argument & goto :end

:main
    if defined OptVerbose (
        echo **** DEBUG IS ON
    )

    echo UnNamedArgument:    "%UnNamedArgument%"

    if defined UnNamedOptionalArg      echo UnNamedOptionalArg: "%UnNamedOptionalArg%"
    if not defined UnNamedOptionalArg  echo UnNamedOptionalArg: not provided

    if defined NamedFlag               echo NamedFlag:          "%NamedFlag%"
    if not defined NamedFlag           echo NamedFlag:          not provided

:end
    call :cleanup
    exit /B

:cleanup
    REM The cleanup function is only really necessary if you
    REM are _not_ using SETLOCAL.
    set "__NAME="
    set "__VERSION="
    set "__YEAR="

    set "__BAT_FILE="
    set "__BAT_PATH="
    set "__BAT_NAME="

    set "OptHelp="
    set "OptVersion="
    set "OptVerbose="

    set "UnNamedArgument="
    set "UnNamedArgument2="
    set "NamedFlag="

    goto :eof

#11楼

制作一个新的批处理文件(例如:openclass.bat),并将此行写入文件中:

java %~n1

然后将批处理文件放在(例如)system32文件夹中,转到您的Java类文件,右键单击“属性”,“打开方式为...”,然后找到您的批处理文件,将其选中,就是这样...

这个对我有用。

PS:关闭Java类时,找不到关闭cmd窗口的方法。 目前...


#12楼

受@Jon 在其他地方给出的答案的启发,我设计了一种更通用的算法来提取命名参数,可选值和开关。

假设我们要实现实用程序foobar 。 它需要一个初始命令。 它有一个可选参数--foo ,它带有一个可选值(当然不能是另一个参数); 如果缺少该值,则默认为default 。 它还具有一个可选参数--bar ,该参数采用必需的值。 最后,它可以带一个标志--baz ,不允许值。 哦,这些参数可以按任何顺序排列。

换句话说,它看起来像这样:

foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]

这是一个解决方案:

@ECHO OFF
SETLOCAL
REM FooBar parameter demo
REM By Garret Wilson

SET CMD=%~1

IF "%CMD%" == "" (
  GOTO usage
)
SET FOO=
SET DEFAULT_FOO=default
SET BAR=
SET BAZ=

SHIFT
:args
SET PARAM=%~1
SET ARG=%~2
IF "%PARAM%" == "--foo" (
  SHIFT
  IF NOT "%ARG%" == "" (
    IF NOT "%ARG:~0,2%" == "--" (
      SET FOO=%ARG%
      SHIFT
    ) ELSE (
      SET FOO=%DEFAULT_FOO%
    )
  ) ELSE (
    SET FOO=%DEFAULT_FOO%
  )
) ELSE IF "%PARAM%" == "--bar" (
  SHIFT
  IF NOT "%ARG%" == "" (
    SET BAR=%ARG%
    SHIFT
  ) ELSE (
    ECHO Missing bar value. 1>&2
    ECHO:
    GOTO usage
  )
) ELSE IF "%PARAM%" == "--baz" (
  SHIFT
  SET BAZ=true
) ELSE IF "%PARAM%" == "" (
  GOTO endargs
) ELSE (
  ECHO Unrecognized option %1. 1>&2
  ECHO:
  GOTO usage
)
GOTO args
:endargs

ECHO Command: %CMD%
IF NOT "%FOO%" == "" (
  ECHO Foo: %FOO%
)
IF NOT "%BAR%" == "" (
  ECHO Bar: %BAR%
)
IF "%BAZ%" == "true" (
  ECHO Baz
)

REM TODO do something with FOO, BAR, and/or BAZ
GOTO :eof

:usage
ECHO FooBar
ECHO Usage: foobar ^<command^> [--foo [^<fooval^>]] [--bar ^<barval^>] [--baz]
EXIT /B 1
  • 使用SETLOCAL以便变量不会逸出到调用环境中。
  • 如果有人在调用环境中定义了变量,不要忘记初始化变量SET FOO=
  • 使用%~1删除引号。
  • 使用IF "%ARG%" == ""而不要使用IF [%ARG%] == []因为[]根本不会播放以空格结尾的值。
  • 即使你SHIFT内部IF块,当前ARGS比如%~1没有得到,因为当他们决定更新IF解析。 您可以在IF块中使用%~1%~2 IF ,但这会造成混淆,因为您有SHIFT 。 为了清楚起见,您可以将SHIFT放在块的末尾,但这可能会迷失和/或使人们感到困惑。 因此,最好在块外“捕获” %~1%~1
  • 您不想使用参数代替另一个参数的可选值,因此您必须检查IF NOT "%ARG:~0,2%" == "--"
  • 使用其中一个参数时,请仅注意SHIFT
  • 令人遗憾的是,重复的代码SET FOO=%DEFAULT_FOO% ,但替代方法是在IF NOT "%ARG%" == ""块外添加IF "%FOO%" == "" SET FOO=%DEFAULT_FOO% 。 但是,由于这仍是里面的IF "%PARAM%" == "--foo"块中, %FOO%的值将被评估,并设置之前,你从来没有入过块,所以你永远不会发现, 无论--foo参数存在,并且还使得%FOO%值丢失。
  • 请注意, ECHO Missing bar value. 1>&2 ECHO Missing bar value. 1>&2将错误消息发送到stderr。
  • 想要Windows批处理文件中的空白行吗? 您必须使用ECHO:或其中一种变体。

#13楼

简单的解决方案(即使问题很旧)

Test1.bat

echo off
echo "Batch started"
set arg1=%1
echo "arg1 is %arg1%"
echo on
pause

CallTest1.bat

call "C:\Temp\Test1.bat" pass123

输出

YourLocalPath>call "C:\Temp\test.bat" pass123

YourLocalPath>echo off
"Batch started"
"arg1 is pass123"

YourLocalPath>pause
Press any key to continue . . .

其中YourLocalPath是当前目录路径。

为了简单起见,将命令参数存储在变量中,并使用变量进行比较。

它不仅易于编写,而且易于维护,因此,如果以后有人或长时间阅读脚本后,将易于理解和维护。

内联编写代码:请参阅其他答案。


#14楼

在此处输入图片说明

要使用循环,请使用纯批处理获取所有参数:

@echo off && setlocal EnableDelayedExpansion

 set "_cnt=0" && for %%Z in (%*) do ( 
 set "_arg_=%%Z" && set /a "_cnt=!_cnt! + 1" && set "_arg_[!_cnt!]=!_arg_!"
 shift && for /l %%l in (!_cnt! 1 !_cnt!) do echo/ The argument n:%%l is: !_arg_[%%l]!
 )

goto :eof 

您的代码已准备就绪,可以在需要的地方使用参数编号进行处理,例如...

 @echo off && setlocal EnableDelayedExpansion

 set "_cnt=0" && for %%Z in (%*) do ( 
 set "_arg_=%%Z" && set /a "_cnt=!_cnt! + 1" && set "_arg_[!_cnt!]=!_arg_!"
 shift 

 )

 fake-command /u !_arg_[1]! /p !_arg_[2]! > test-log.txt

#15楼

使用%1,%2,...%9或%*,可以轻松访问批处理参数。
但前提是内容简单。

对于诸如"&"^&类的复杂内容,没有简单的方法,因为无法访问%1而不会产生错误。

set  var=%1
set "var=%1"
set  var=%~1
set "var=%~1"

线扩大到

set  var="&"&
set "var="&"&"
set  var="&"&
set "var="&"&"

每行都会失败,因为&之一在引号之外。

可以通过从临时文件中读取该参数的标记版本来解决。

@echo off
SETLOCAL DisableDelayedExpansion

SETLOCAL
for %%a in (1) do (
    set "prompt="
    echo on
    for %%b in (1) do rem * #%1#
    @echo off
) > param.txt
ENDLOCAL

for /F "delims=" %%L in (param.txt) do (
  set "param1=%%L"
)
SETLOCAL EnableDelayedExpansion
set "param1=!param1:*#=!"
set "param1=!param1:~0,-2!"
echo %%1 is '!param1!'

诀窍是在rem语句之后启用echo on并扩展%1(也可用于%2 .. %* )。
因此,即使"&"&也可以在不产生错误的情况下回显,如前所述。

但是要能够重定向echo on的输出,您需要两个for循环。

多余的字符* #用于防止诸如/?内容/? (将显示REM的帮助)。
或者,即使在rem之后,行尾的插入符号^也可以用作多行字符。

然后仔细阅读文件中的rem参数输出。
FOR / F应该在延迟扩展关闭的情况下工作,否则内容应带有“!” 将被摧毁。
在删除param1的多余字符之后,您就知道了。

为了安全使用param1 ,请启用延迟扩展。


#16楼

在批处理文件中

set argument1=%1
set argument2=%2
echo %argument1%
echo %argument2%

%1和%2分别返回第一个和第二个参数值。

然后在命令行中通过thestrmt

Directory> batchFileName admin P@55w0rd 

输出将是

admin
P@55w0rd

#17楼

这是我的操作方式:

@fake-command /u %1 /p %2

该命令如下所示:

test.cmd admin P@55w0rd > test-log.txt

%1适用于第一个参数, %2 (这是棘手的部分)适用于第二个参数。 通过这种方式,您最多可以传递9个参数。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/asdfgh0077/article/details/103508592

智能推荐

Deepin wine QQ/微信中文显示为方块的原因之一_wine 字体方块-程序员宅基地

文章浏览阅读984次。问题原因:目录下~/.deepinwine,查找乱码的应用Deepin-QQ、Deepin-WeChat,相同路径/drive_c/windows/Fonts下查看是否有字体,笔者发现没有任何字体,这就是原因所致,wine程序会在此处寻找字体,而不能直接利用linux系统的字体解决方法:把/usr/share/fonts/Fonts_Win下字体复制到这里,使wine应用程序能找到至少一种fallback字体,也可以在别的地方的fonts问价夹下,拷贝.ttf字体文件到这里..._wine 字体方块

整个元素周期表通用,AI 即时预测材料结构与特性-程序员宅基地

文章浏览阅读264次。编辑 | 绿萝材料的性质由其原子排列决定。然而,现有的获得这种排列的方法要么过于昂贵,要么对许多元素无效。现在,加州大学圣地亚哥分校纳米工程系的研究人员开发了一种人工智能算法,可以几乎即时地预测任何材料(无论是现有材料还是新材料)的结构和动态特性。该算法被称为 M3GNet,用于开发 matterverse.ai 数据库,该数据库包含超过 3100 万种尚未合成的材料,其特性由机器学习算法预测。M..._人工智能预测材料属性

Docker & Nvidia-docker 镜像基础操作_dokcer怎么使用nvidia作为基础镜像-程序员宅基地

文章浏览阅读5.8k次,点赞2次,收藏25次。简述 docker & nvidia-docker感觉是深度学习的环境配置与部署简化很多,下面记录一下基础的命令,为自己后续用到查阅。在使用之前请先安装好NVIDIA驱动,CUDA以及docker & nvidia-docker的基本环境。docker & nvidia-docker 导入与导出镜像导出镜像:nvidia-docker save -o /save_p..._dokcer怎么使用nvidia作为基础镜像

测试生成攻击Linux操作系统的木马命令_linux msfvenom -p linux/x64/meterpreter/reverse_tc-程序员宅基地

文章浏览阅读312次,点赞6次,收藏9次。你看你以为黑客有多牛呢,都是在利用别人的工具呢。_linux msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=你的 ip lport=你监

12款程序员专用chrome插件神器推荐_谷歌按键精灵插件中文-程序员宅基地

文章浏览阅读2.8k次。前言对于从事IT行业的我们来说,几乎无时无刻都在用chrome浏览器,因为它给我们的工作和生活带来了极大的便利。今天给大家分享11款牛逼的chrome插件。1. 谷歌翻译很多小伙伴,英语不太好,包括我自己,英语刚过四级。从事软件相关工作时,有时有些吃力,因为很多优秀的技术网站、书籍或者文章都是老外写的,如果因为看不懂就放弃阅读,我们将会少了很多学习和进步的机会。今天分享的第一个神器就是:谷歌翻译。在没使用谷歌翻译之前,访问https://docs.mongodb.com/drivers/java/_谷歌按键精灵插件中文

python如何做抢东西软件,python爬虫小程序抢购-程序员宅基地

文章浏览阅读749次,点赞28次,收藏20次。每到双十一,各位男性朋友们就要大吐血了,万一女朋友想要的东西还没有抢到,就要更加…所以我便创造了这个自动抢购的脚本,希望对你们有用① Python所有方向的学习路线图,清楚各个方向要学什么东西② 600多节Python课程视频,涵盖必备基础、爬虫和数据分析③ 100多个Python实战案例,含50个超大型项目详解,学习不再是只会理论④ 20款主流手游迫解 爬虫手游逆行迫解教程包⑤ 爬虫与反爬虫攻防教程包,含15个大型网站迫解⑥ 爬虫APP逆向实战教程包,含45项绝密技术详解。

随便推点

HCS12X–数据定义(如何在CodeWarrior中将数据定义到分页区)_codewarrior数组如何定义-程序员宅基地

文章浏览阅读384次。由于在暑假匆忙接收的嵌入式项目中需要使用特别大的数组,非分页RAM的内存不够用了,没办法,硬着头皮尝试使用分页RAM,但是完全没有单片机的基础,导致极其的困难。之前写程序都是按照纯软件的思维,主要考虑架构,不会考虑到每个变量具体存在哪个物理地址这么底层的问题,结果被飞思卡尔这分页地址、prm文件什么的搞得一头雾水,而网上的资料又少,讲的又大同小异的笼统,最后写出来的程序因为这分页地址的原因存在各种_codewarrior数组如何定义

wed服务器简介_wed服务器的主要特点之一就是它具有十几个html文件连接到另一个html文件的能力称为-程序员宅基地

摘要:Web服务器是用于提供Web服务的软件,它通过HTTP协议来传输和接收网页和其他资源。在Inteet上,HTTP通信通常在TCP/IP连接上进行,使用端口号80。Apache是一种常见的Web服务器软件,其主程序为httpd,根目录为/var/www/html。

Python调用C++举例_cmake编译 python调用c++ so文件-程序员宅基地

文章浏览阅读435次。使用ctypes模块直接加载so函数为:ctypes.cdll.LoadLibrary("so文件路径")_cmake编译 python调用c++ so文件

配置密钥方法-程序员宅基地

文章浏览阅读1.3k次。1 git config --global user.name “你的账号”2 git config --global user.email “邮箱”3 查询账号 :git config user.name4 ssh-keygen -t rsa -C “邮箱”5 cd ~/.ssh6 cat id_rsa.pub (返回一串密钥字母)7 将其配置在setting下的密钥中..._配置密钥

Ubuntu 使用命令向QQ邮箱发送邮件_linux mailutils设置发送邮箱-程序员宅基地

文章浏览阅读3.4w次,点赞6次,收藏9次。1、安装heirloom-mailxsudo apt-get install heirloom-mailx2. 修改/etc/s-nail.rc中来添加外部SMTP服务器如下:这是个只读文件,先改权限: sudo chmod 777 /etc/s-nail.rc在普通用户下执行:vim /etc/s-nail.rc在文件最后加上:【把××××××××××换成你的邮箱地址】set from=××××××××××@qq.comset smtp=smtps://s_linux mailutils设置发送邮箱

python实现感知器模型_感知器python-程序员宅基地

文章浏览阅读157次。在训练过程中,每个迭代步骤都会输出当前的损失函数值和超平面的权重和偏置。在本例中,使用了三个数据点进行训练,因此可以得到多个超平面来进行分类。最终,训练后的超平面参数被输出,可以用于测试新的数据点。_感知器python

推荐文章

热门文章

相关标签