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

Using parameters in batch files at Windows command line

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

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


另一些参数已经说过,通过命令线的参数可以在批量文件中以%1的标记进入%9。还有两个你可以使用的工具:

  • 是指在命令行中指定的可执行(分批文件)名称。
  • 是命令线中所有特异参数——如果你想将参数向前推进到另一个程序,这是非常有用的。

此外,还有许多重要的技术,可以在简单地获得参数的过程中了解这些技术。

检查参数是否经过

这是以IF"%~1"==""的方式进行的,如果没有任何论据,这是真的。注:Tilde character which causes any surrounding contributions to be removed from the value of %1;without a tilde you will get unexpected results if that value includes doubles contributions,including the possibility of synta

处理的比9个论据还要多(或只是使生活简单)

如果你需要超过9个论据,你必须使用SHIFT。这一命令改变了所有参数在一个位置的价值,因此,%0〔1〕以%1的价值为依据,采用%2的价值为依据,1〔2〕以Tenth Argent的价值为依据(如果有一个存在的话),在召唤EDOC1〔16〕之前任何变量都不可用。更多选项

当你想要简单的过程参数而不要求它们在一个特定的顺序中出现时,也是有用的。例如,一个脚本可以识别任何标记。在这样的情况下,一个很好的方法是接管指挥线。

1
2
3
4
5
6
7
8
: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!

这个方案使你能够在没有内疚的情况下完成漂亮的复杂指挥线。

批量参数的替换

For parameters that represent file names the shell provides lots of functionality related to working with files that is not accessible in any other way.这一功能性是通过与%~一起建立的。

举例来说,要将文件大小作为一个论据的使用

1
ECHO %~z1

从(非常使用!)你可以使用

1
ECHO %~dp0

你可以在快速命令中看到这些能力的全部范围。


使用Batch files中的参数:%0 and%9

Batch files can refer to the words passed in as parameters with the tokens:%0to %9

1
2
3
4
%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起,该程序名为%0后称为%0

Example:

在一个叫mybatch.bat的批量文件中插入以下命令:

ZZU1

使用这类批量文件:EDOCX1&8)

1
hello john billy

Get more than 9 parameters for a batch file,use:%*

《穿透星球的火焰》你可以用一个环路抓住他们

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

关于删除批量参数的说明

Some characters in the command line parameters are ignored by batch files,depending on the dos version,whether they are"escaped"or not,and often depending on their location in the command line:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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


批量文件自动地在程序后面经过如此长的时间,而它们的变量则可变地分配给它们。他们按顺序通过;E.G.%1将是程序后的第一个字符串,等等。

如果你有Hello.bat和内容是:

1
2
3
@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause

你通过指挥部召唤了船舱

hello.bat APerson241 %date%

你应该收到这个消息

您好,谢谢您运行这个蝙蝠侠文件(01/11/2013)


使用变量1.E.The .BATVarians and called %0to %9


@乔恩的:parse:endparse计划是一个很好的开始,我很感谢他第一次通过,但是如果你认为windows的批处理系统会让你轻松地离开……好吧,我的朋友,你会很震惊的。我和这个魔鬼共度了一整天,经过许多痛苦的研究和实验,我终于找到了一个现实生活中实用的东西。

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

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

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

复杂的?不,这看起来很典型的现实生活中的公用事业。(有人吗?)

无需更多的麻烦,这里有一个解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
@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上的类似文章,在这里我提供了关于逻辑中发生的事情以及我为什么使用某些构造的更多分析。

丑陋的我今天要学的大部分。而且很痛。