【问题标题】:Executing multiple commands from a Windows cmd script从 Windows cmd 脚本执行多个命令
【发布时间】:2010-09-16 21:54:45
【问题描述】:

我正在尝试编写一个 Windows cmd 脚本来连续执行多个任务。 但是,它总是在脚本中的第一个命令之后停止。

它停止后的命令是一个 Maven 构建(不确定这是否相关)。

请问如何让它继续并依次运行每个任务?

安装任何软件或配置注册表等是完全不可能的 - 恐怕它必须在普通 Windows XP 安装上工作。

理想情况下,如果任何命令失败,我希望脚本中止,但这是“很高兴拥有”,不是必需的。

谢谢。

【问题讨论】:

标签: windows batch-file scripting cmd


【解决方案1】:

仅当第一个命令成功时,使用双与号将运行第二个命令:

cd Desktop/project-directory && atom .

其中,即使第一个命令失败,仅使用一个 & 号也会尝试运行这两个命令:

cd Desktop/project-directory & atom .

【讨论】:

    【解决方案2】:

    我不知道你的问题的直接答案,但如果你做了很多这些脚本,可能值得学习一门更强大的语言,比如 perl。存在适用于 Windows 的免费实现(例如 activestate、cygwin)。我发现为自己的任务付出最初的努力是值得的。

    编辑:

    正如@Ferruccio 所建议的,如果您无法安装额外的软件,请考虑使用 vbscript 和/或 javascript。它们内置于 Windows 脚本宿主中。

    【讨论】:

    • 谢谢,但我无法安装任何软件。我希望我能接触到比蹩脚的 Windows 脚本语言更强大的东西。 :-(
    • 您始终可以使用 vbscript 或 javascript。它们内置于 Windows 脚本宿主中。
    【解决方案3】:

    如果您在 Windows 中运行,则可以使用以下命令。

    驱动器:

    cd "Script location"
    schtasks /run /tn "TASK1"
    schtasks /run /tn "TASK2"
    schtasks /run /tn "TASK3"
    exit
    

    【讨论】:

      【解决方案4】:

      请注意,批处理文件中不需要分号。而需要使用call的原因是mvn本身是一个批处理文件,批处理文件之间需要用call相互调用,否则控制权不会返回给调用者。

      【讨论】:

        【解决方案5】:

        我刚刚做了完全相同的(ish)任务,即创建一个批处理脚本来运行 maven 测试脚本。问题是使用 mvn clean install ... 调用 maven 脚本本身就是一个脚本,因此需要使用 call mvn clean install 来完成。

        有效的代码

        rem run a maven clean install
        cd C:\rbe-ui-test-suite 
        call mvn clean install
        rem now run through all the test scripts
        call mvn clean install -Prun-integration-tests -Dpattern=tc-login
        call mvn clean install -Prun-integration-tests -Dpattern=login-1
        

        注意使用调用。这将允许在批处理文件中使用连续的 maven 脚本。

        【讨论】:

          【解决方案6】:

          当你调用另一个.bat文件时,我认为你需要在调用前加上“call”:

          call otherCommand.bat
          

          【讨论】:

          • 嗨,在原始脚本中我没有调用其他 .cmd 文件,但我已经将它拆分为单独的文件,以便我可以依次运行每个文件。所以,在每个命令前面加上 call 似乎已经成功了,谢谢!
          • 事实上,在Windows上,mvn本身就是一个.bat文件,所以你需要像call mvn install一样使用call;通常你不需要创建额外的 cmd 文件。
          • 请注意,批处理文件中不需要分号。而需要使用call的原因是mvn本身是一个批处理文件,批处理文件之间需要用call相互调用,否则控制权不会返回给调用者。
          • @Gulzar Nazim - 你知道我是否可以使用 if-else 语句将所有命令放在一个批处理文件中,因为我不想在不同的批处理文件中维护它?
          • 我试图对npm 更新和protractor 测试做类似的事情。直到我意识到 npmprotractor 是 Windows 上的 .cmd 文件,我才认为这个答案适用于我。
          【解决方案7】:

          不确定为什么第一个命令停止。 如果你可以让它并行,你可以尝试类似

          start cmd.exe /C 1.bat      
          start cmd.exe /C 2.bat
          

          【讨论】:

          • 如果您希望 shell 在命令执行后保持打开状态,请使用 /K 而不是 /C
          • 无需使用cmd.exestart,只需start x.bat1 即可。
          【解决方案8】:

          只有在第一个命令成功的情况下,才能在命令之间使用 && 符号来执行第二个命令。更多信息在这里http://commandwindows.com/command1.htm

          【讨论】:

          • 谢谢,我会结合上面接受的答案尝试一下。
          • 如果 maven 构建失败,这会停止执行第二个脚本吗?
          • 那个链接坏了:“后端服务器没有及时响应。应用服务器太忙,无法及时处理请求。”
          • @TheM Windows 区分基于 GUI 和基于命令的应用程序(在 EXE 文件的开头附近有一个标志)。如果您从命令行启动基于 GUI 的应用程序,它似乎总是立即结束,因为它与命令行完全分离。如果您从 GUI 程序(如资源管理器)启动基于命令的程序,它将始终显示一个新的命令行。 POSIX 系统没有这样的区别,因此行为更加一致。
          • @TheM 要解决这个问题,您可以使用start /B /WAIT calc
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-13
          • 1970-01-01
          • 2011-07-24
          • 2016-06-17
          相关资源
          最近更新 更多