当前位置: 首页 > 知识库问答 >
问题:

在 Windows 命令行上使用批处理文件中的参数

佟阳云
2023-03-14

在Windows中,如何访问批处理文件运行时传递的参数?

例如,假设我有一个名为< code>hello.bat的程序。当我在Windows命令行输入< code>hello -a时,如何让我的程序知道< code>-a是作为参数传入的?

共有3个答案

唐恺
2023-03-14

@Jon的< code >:parse /< code >:end parse 方案是一个很好的开始,我对他最初的成功表示感谢,但是如果你认为Windows折磨人的批处理系统会让你这么容易就脱身……那么,我的朋友,你要震惊了。我花了一整天的时间研究这个恶魔,经过许多痛苦的研究和实验,我终于找到了一个现实生活中可行的工具。

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

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

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

复杂的不,这似乎是现实生活中公用事业的典型特征。(git有人吗?)

事不宜迟,这里有一个解决方案:

@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

是的,真的是那么糟糕。请参阅我在 https://stackoverflow.com/a/50653047/421049 上的类似文章,其中我对逻辑中发生的事情以及为什么我使用某些构造进行了更多分析。

可怕的。我今天必须学会的大部分内容。很痛。

姜乐语
2023-03-14

在批处理文件中使用参数:%0 和 %9

批处理文件可以引用作为参数传入的带有标记的单词:%0%9

%0 is the program name as it was called.
%1 is the first command line parameter
%2 is the second command line parameter
and so on till %9.

在命令行上传入的参数必须是字母数字字符并由空格分隔。由于%0是它被调用的程序名,因此在DOS%0中,如果在引导时启动,将为空AUTOEXEC.BAT。

例子:

将以下命令放在名为 mybatch 的批处理文件中.bat:

@echo off
@echo hello %1 %2
pause

像这样调用批处理文件:我的批处理约翰比利将输出:

hello john billy

要获取批处理文件的9个以上参数,请使用:%*

星号标记的百分比<code>%*

http://www.robvanderwoude.com/parameters.php

有关批处理参数分隔符的说明

批处理文件中的某些字符会被批处理文件忽略,具体取决于 DOS 版本,无论它们是否“转义”,并且通常取决于它们在命令行中的位置:

commas (",") are replaced by spaces, unless they are part of a string in 
double quotes

semicolons (";") are replaced by spaces, unless they are part of a string in 
double quotes

"=" characters are sometimes replaced by spaces, not if they are part of a 
string in double quotes

the first forward slash ("/") is replaced by a space only if it immediately 
follows the command, without a leading space

multiple spaces are replaced by a single space, unless they are part of a 
string in double quotes

tabs are replaced by a single space

leading spaces before the first command line argument are ignored
薛祯
2023-03-14

正如其他人已经说过的,通过命令行传递的参数可以在批处理文件中访问,标记为%1%9。您还可以使用另外两种代币:

  • %0是命令行中指定的可执行文件(批处理文件)名称。
  • %*是命令行中指定的所有参数——如果您想将参数转发到另一个程序,这非常有用。

除了简单地了解如何访问参数之外,还有许多重要的技术需要了解。

这是通过像< code>IF "%~1"==""这样的结构来实现的,当且仅当根本没有传递任何参数时才成立。请注意导致从< code>%1的值中删除任何引号的波浪号字符;如果没有波浪号,您将会得到意外的结果,如果该值包含双引号,包括语法错误的可能性。

如果您需要访问超过9个参数,您必须使用命令SHIFT。此命令将所有参数的值移动一个位置,以便%0获取%1的值,%1获取%2等的值。%9获取第十个参数(如果存在)的值,该值在调用SHIFT之前无法通过任何html" target="_blank">变量使用(输入命令SHIFT/?获取更多选项)。

当您想要轻松处理参数而不需要以特定顺序显示参数时,SHIFT 也很有用。例如,脚本可以按任意顺序识别标志 -a-b。在这种情况下解析命令行的一个好方法是

:parse
IF "%~1"=="" GOTO endparse
IF "%~1"=="-a" REM do something
IF "%~1"=="-b" REM do something else
SHIFT
GOTO parse
:endparse
REM ready for action!

此方案允许您在不发疯的情况下解析非常复杂的命令行。

对于表示文件名的参数,shell提供了许多与处理以其他方式无法访问的文件相关的功能。使用以<code>%~

例如,要获取作为参数传入的文件大小,请使用

ECHO %~z1

要获取启动批处理文件的目录的路径(非常有用!)您可以使用

ECHO %~dp0

您可以通过在命令提示符中键入CALL/?来查看这些功能的全部范围。

 类似资料:
  • 我想运行一个批处理文件A,它调用/启动另一个批处理文件B,后者打开一个新的cmd窗口。然后,我想在这个新的cmd窗口中运行一个用户定义的命令。这个命令只有在运行文件B之后或者在这个新的cmd-window中才能被识别,但是命令本身的调用应该是写在文件A中的(文件B是设置好的,不能更改)。我该怎么做? 就我所理解的行为而言,我不能访问由另一个批处理文件打开的cmd窗口。我写了一个简单的测试用例来向你

  • 我希望运行以下链接 jenkins的错误如下: 'node'无法识别为内部或外部命令、可操作程序或批处理文件。 构建步骤'执行Windows批处理命令'标记构建为失败完成:失败

  • 我想执行一个批处理文件 D:\apache-tomcat-6.0。20\apache-tomcat-7.0。30\bin\shutdown。球棒 它位于我的服务器上。 我应该如何编写我的文件?

  • 问题内容: 如何运行批处理文件并将参数传递给jar文件? 这不起作用 mybat.bat 运行蝙蝠文件 Java只能看到 问题答案: 我刚刚尝试了一个仅将参数转储到屏幕的小型Java程序: 和以下批处理文件: 我最终得到以下结果 对于与您相同的命令行,等号’=’消失了。现在,如果将批处理文件截断为此: 您将获得另一个结果(可能是您期望的结果-不清楚) 这种%*语法的优点在于,它可以通过接受任意数量

  • 我试图使用批处理脚本执行这个命令: 问题是每次我执行批处理脚本时,它都会询问密码。如何通过批处理文件输入密码参数?

  • 我创建了一个Windows批处理文件来启动我的Play Framework应用程序,详情如下:Play Framework bat Windows java process 这是可行的,但当我尝试添加命令行标志以指定生产配置文件时,会收到“Not a Play application”(非播放应用程序)错误消息: 我的两个问题是: “%1”和“.”是什么意思向java启动器表示 如何在Window