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

命令行如下所示:

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

#1楼

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

@echo offxcopy %1 %2 /D /E /C /Q /H /R /K /Y /Zecho copied %1 to %2pause

“暂停”显示批处理文件已完成的操作,并等待您按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:No1ECHO No param 1
GOTO End1
:No2ECHO No param 2
GOTO End1:End1

#7楼

FOR %%A IN (%*) DO (REM Now your batch file handles %%A instead of %1REM 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 defC:\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%"=="-" (endlocalgoto read_params)endlocal & set %__var:~1%=%~1) else (setlocal & set __var=%~1)shiftgoto 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:headerecho %__NAME% v%__VERSION%echo This is a sample batch file template,echo providing command-line arguments and flags.echo.goto :eof:usageecho USAGE:echo   %__BAT_NAME% [flags] "required argument" "optional argument" echo.echo.  /?, --help           shows this helpecho.  /v, --version        shows the versionecho.  /e, --verbose        shows detailed outputecho.  -f, --flag value     specifies a named parameter valuegoto :eof:versionif "%~1"=="full" call :header & goto :eofecho %__VERSION%goto :eof:missing_argumentcall :headercall :usageecho.echo ****                                   ****echo ****    MISSING "REQUIRED ARGUMENT"    ****echo ****                                   ****echo.goto :eof:initset "__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=":parseif "%~1"=="" goto :validateif /i "%~1"=="/?"         call :header & call :usage "%~2" & goto :endif /i "%~1"=="-?"         call :header & call :usage "%~2" & goto :endif /i "%~1"=="--help"     call :header & call :usage "%~2" & goto :endif /i "%~1"=="/v"         call :version      & goto :endif /i "%~1"=="-v"         call :version      & goto :endif /i "%~1"=="--version"  call :version full & goto :endif /i "%~1"=="/e"         set "OptVerbose=yes"  & shift & goto :parseif /i "%~1"=="-e"         set "OptVerbose=yes"  & shift & goto :parseif /i "%~1"=="--verbose"  set "OptVerbose=yes"  & shift & goto :parseif /i "%~1"=="--flag"     set "NamedFlag=%~2"   & shift & shift & goto :parseif not defined UnNamedArgument     set "UnNamedArgument=%~1"     & shift & goto :parseif not defined UnNamedOptionalArg  set "UnNamedOptionalArg=%~1"  & shift & goto :parseshiftgoto :parse:validateif not defined UnNamedArgument call :missing_argument & goto :end:mainif defined OptVerbose (echo **** DEBUG IS ON)echo UnNamedArgument:    "%UnNamedArgument%"if defined UnNamedOptionalArg      echo UnNamedOptionalArg: "%UnNamedOptionalArg%"if not defined UnNamedOptionalArg  echo UnNamedOptionalArg: not providedif defined NamedFlag               echo NamedFlag:          "%NamedFlag%"if not defined NamedFlag           echo NamedFlag:          not provided:endcall :cleanupexit /B:cleanupREM The cleanup function is only really necessary if youREM 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 WilsonSET CMD=%~1IF "%CMD%" == "" (GOTO usage
)
SET FOO=
SET DEFAULT_FOO=default
SET BAR=
SET BAZ=SHIFT
:args
SET PARAM=%~1
SET ARG=%~2
IF "%PARAM%" == "--foo" (SHIFTIF 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" (SHIFTIF NOT "%ARG%" == "" (SET BAR=%ARG%SHIFT) ELSE (ECHO Missing bar value. 1>&2ECHO:GOTO usage)
) ELSE IF "%PARAM%" == "--baz" (SHIFTSET BAZ=true
) ELSE IF "%PARAM%" == "" (GOTO endargs
) ELSE (ECHO Unrecognized option %1. 1>&2ECHO:GOTO usage
)
GOTO args
:endargsECHO 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" pass123YourLocalPath>echo off
"Batch started"
"arg1 is pass123"YourLocalPath>pause
Press any key to continue . . .

其中YourLocalPath是当前目录路径。

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

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

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


#14楼

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

@echo off && setlocal EnableDelayedExpansionset "_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 EnableDelayedExpansionset "_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 DisableDelayedExpansionSETLOCAL
for %%a in (1) do (set "prompt="echo onfor %%b in (1) do rem * #%1#@echo off
) > param.txt
ENDLOCALfor /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个参数。

如何将参数传递给批处理文件?相关推荐

  1. Windows批处理文件*.bat

    Windows批处理文件 [ 一.什么是批处理 ] 批处理(Batch),也称为批处理脚本.顾名思义,批处理就是对某对象进行批量的处理.批处理文件的扩展名为 bat . 目前比较常见 的批处理包含两类 ...

  2. jdk12‘javac‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    前言: 安装JDK12遇到的问题以及学习过程, 我第一次用网上的安装办法,下载EXE后,配置好三个环境变量后运行,不行. 解决过程: 问题1:安装后javac命令运行时报错 jdk12'javac' ...

  3. vue 不是内部或外部命令,也不是可运行的程序 或批处理文件

    vue 安装 vue-cli 成功之后 控制台查看vue的版本 提示 vue 不是内部或外部命令,也不是可运行的程序 或批处理文件 我的问题 就环境变量没有配置 下面以window 10 系统说下我的 ...

  4. C++ 函数参数传递:传值,传指针,传引用

    PS:首先理解形参   实参概念.形参是在函数定义的括号内定义的专用变量,它们的目的是保存按实参传递给它们的信息,实参被列在函数调用语句的括号内. int func(int x)//x是形参 {ret ...

  5. Windows下批处理文件(.bat)的使用

    批处理(Batch),就是进行批量的处理,英文译文BATCH,批处理文件后缀BAT就取的前三个字母,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中.批处理文件是扩展名为.bat或 ...

  6. append函数_连载|想用Python做自动化测试?函数的参数传递机制及变量作用域

    " 这一节有点难.看不懂没关系.继续往后学,回头再来看." 10.6 函数参数传递的机制 10.6.1 值传递与引用传递 编程语言的参数传递机制通常有两种: 值传递 拷贝参数的值, ...

  7. bat批处理文件启动Eclipse和ivy本地仓库的配置

    一.bat批处理文件启动Eclipse 所需文件: 1.eclipse 2.jre 3.startup-eclipse.bat 确保以上三个文件夹同级 startup-eclipse.bat: set ...

  8. java参数传递:值传递还是引用传递

    2019独角兽企业重金招聘Python工程师标准>>> 基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的: 在Java中对象作为参数传递时,是把对象在 ...

  9. MVVM开发模式MVVM Light Toolkit中使用事件和参数传递

    Light中定义了类GalaSoft.MvvmLight.Command.RelayCommand 这个类继承了ICommand方法,实现了其中的方法,Action就是一个方法参数 // 摘要: // ...

最新文章

  1. Imagination 推新款GPU IP,首次实现桌面级光线追踪效果
  2. 三电平igbt死区时间计算_IGBT基础与运用知识
  3. 为什么要预留字段_「镜前灯电线预留位置」为什么要安装镜前灯 镜前灯电线预留位置...
  4. spring----IOC知识点
  5. Kylin启动异常:java.lang.outofMemoryError:Requested array size exceeds VM limit
  6. 钟南山:疫情1周或10天左右达到高峰,不会大规模增加了!
  7. Android Animation学习(三) ApiDemos解析:XML动画文件的使用
  8. 什么样的生意一本万利?
  9. PHP 官方被黑与“网络军火商”Zerodium 有关?CEO 辟谣:这个漏洞就是垃圾
  10. DDK build的时候C2220警告当错误处理
  11. jQuery 学习-DOM篇(六):jQuery 替换 DOM 元素
  12. mysql seconds_behind_master_MySQL同步状态双Yes的假象及seconds_behind_master的含义
  13. html星空代码在线,怎么操作html星空特效代码
  14. Nginx 重定向所有子域名到www
  15. 苹果手机回收价格怎么查询
  16. 人造肉在中国还有未来吗?
  17. 谷歌和IE的兼容问题
  18. 企业生产管理集成的核心工具—MES管理系统
  19. Excel学习——制作周报
  20. 全国优秀计算机动画作品,分享創意——全国中小学优秀电脑作品分析.ppt

热门文章

  1. Android LocalBroadcast 本地广播源码解析
  2. Java CAS AtomicInteger使用
  3. MethodTrace 生成的trace文件为空
  4. svn TortoiseSVN 回滚版本
  5. 【Android】最近做的一个Android平台下时间统计工具
  6. vbox 设置linux共享文件夹,Windows 7下设置VirtualBox中Linux共享文件夹
  7. oc怎么添加win引导_OC图像纹理节点和透明贴图的使用方法
  8. 数据算法——Spark二次排序
  9. 【javascript基础】由demo来进阶学习闭包等概念
  10. SQL Server创建视图——视图的作用