如何利用批处理命令让两个WINDOWS程序按照顺序运行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用批处理命令让两个WINDOWS程序按照顺序运行?相关的知识,希望对你有一定的参考价值。

我的移动硬盘里面有两个安装程序 每次都是需要安装一个 然后再打开另外一个安装才能完成整个安装任务,能不能用批处理命令实现只需要运行一下批处理命令就可以达到按照次序安装这两个程序的功能?
特殊说明:必须是要先运行完1.EXE才能再运行2.EXE程序
1.EXE安装完成以后C:/AN/下面就会有一个RUN.EXE的文件存在
另外还需要删除安装以后的无用的文件:LOG1.TXT
并且最后要覆盖模式拷贝批处理文件所在目录下的两个文件 SAMPLE1.CFG和SAMPLE2.CFG到 C:\RUN\

建议你用call调用另一个批处理文件,比如创建两个批处理文件1.bat和2.bat。1.bat用于执行1.exe,在它后面加个pause,再加个call 2.bat
它的意思是在安装1.exe的时候是处于pause状态的,当安装完以后,你可以按任意键让它继续执行,也就是执行2.bat,在2.bat里面执行2.exe的程序!
(其实合并在一起也是可以解决的)
参考技术A 复制以下内容,保存为bat
@echo off
call 1.exe
call 2.exe
exit
又或者
@echo off
1.exe
if exist c:\an\run.exe 2.exe & goto end
@echo 未找到c:\an\run.exe按任意键退出
pause
:end
del/q LOG1.TXT
xcopy/y SAMPLE1.CFG C:\RUN\
xcopy/y SAMPLE1.CFG C:\RUN\
echo 安装成功完成,按按任意键退出
pause
exit
这条的意识是,执行完1.exe以后,如果找到c:\an\run.exe 则执行2.exe否则显示:未找到c:\an\run.exe按任意键退出本回答被提问者采纳
参考技术B 如果是想让多个.exe程序按顺序执行(即执行完1.exe,再执行2.exe····)。只需要去掉start即可,也就是直接按顺序写:
1.exe
2.exe

·····
(exe前不要加start,因为start会让exe程序在新的批处理中运行,所以如果每个exe前都加了start的话,就相当于同时启动了这些exe)

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

【中文标题】在 Windows 命令行中使用批处理文件中的参数【英文标题】:Using parameters in batch files at Windows command line 【发布时间】:2012-12-26 12:35:39 【问题描述】:

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

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

【问题讨论】:

如何将命令行参数传递给批处理文件:***.com/questions/26551/… 【参考方案1】:

使用变量,即.BAT 变量并调用%0%9

【讨论】:

【参考方案2】:

在批处理文件中使用参数:%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

像这样调用批处理文件:mybatch john billy 将输出:

hello john billy

为一个批处理文件获取超过 9 个参数,使用:%*

百分比星标记%* 表示“其余参数”。您可以使用 for 循环来获取它们,定义如下:

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

【讨论】:

【参考方案3】:

批处理文件会在程序之后自动传递文本,只要它们是分配给它们的变量。它们按发送顺序传递;例如%1 将是调用程序后发送的第一个字符串,等等。

如果你有 Hello.bat 并且内容是:

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

然后你通过命令调用批处理

hello.bat APerson241 %date%

您应该会收到此消息:

您好,APerson241 感谢您运行此批处理文件 (01/11/2013)

【讨论】:

【参考方案4】:

正如其他人已经说过的,通过命令行传递的参数可以在批处理文件中使用%1%9 表示法访问。您还可以使用另外两个令牌:

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

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

检查是否传递了参数

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

处理超过 9 个参数(或只是让生活更轻松)

如果您需要访问超过 9 个参数,您必须使用命令 SHIFT。此命令将所有参数的值移动一位,以便 %0 采用 %1 的值,%1 采用 %2 的值等。%9 采用第十个参数的值(如果有存在),在调用SHIFT 之前无法通过任何变量获得(输入命令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 提供了许多与处理无法以任何其他方式访问的文件相关的功能。使用以%~ 开头的构造访问此功能。

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

ECHO %~z1

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

ECHO %~dp0

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

【讨论】:

:parse, :endparse 结构很漂亮,即使是 GOTO。谢谢! (我的意思是,DOS-BASIC 强制 GOTO) 从 powershell 调用 BAT 时,此技术可能会失败。像 "name=John" 这样的引用参数在 exe 期间将变为 name John。一种解决方法是用单引号括起来,'"name=John"' 没有CALL /?,我怎么走了这么久?!在这里,我一直在与 Google 擦肩而过。 @Jon 我写的 bat 文件只包含一个代码 echo %1 如果我通过 cmd 调用它,例如 xx.bat &parameter > "C:\yy.txt" 用参数调用 bat 文件并写入到 txt 文件,但如果我在开头或结尾给出 & in 参数,它就不起作用。任何其他文本都可以正常工作。【参考方案5】:

@Jon 的:parse/:endparse 方案是一个很好的开始,我感谢他的初步通过,但如果你认为 Windows 折磨人的批处理系统会让你轻松......好吧,我的朋友,你会大吃一惊。我花了一整天的时间在这个恶魔上,经过大量痛苦的研究和实验,我终于找到了一些可行的实用程序。

假设我们要实现一个实用程序foobar。它需要一个初始命令。它有一个可选参数--foo,它接受一个可选值(当然不能是另一个参数);如果缺少该值,则默认为default。它还有一个可选参数 --bar,它采用 required 值。最后,它可以带一个标志--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://***.com/a/50653047/421049 上的类似帖子,其中我提供了更多关于逻辑中发生了什么以及我为什么使用某些构造的分析。

丑陋的。我今天必须学习的大部分内容。而且很痛。

【讨论】:

以上是关于如何利用批处理命令让两个WINDOWS程序按照顺序运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何对 Windows 10 批处理文件中的参数列表进行排序

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

如何在 Jenkins“执行 Windows 批处理命令”中组合两个或多个命令

求一个让Windows应用程式置顶批处理或者VBS程序

易语言中如何让WINDOWS控制台程序显示结果,执行到光标处停下来。

Windows 技术篇-利用telnet方法ping端口通不通实例演示,如何测试服务器端口是否启用,windows启用telnet功能