在Windows批处理文件中一行上运行多个命令

120
在Unix中,我们可以像这样将多个命令放在一行中:
$ date ; ls -l ; date

我在Windows上尝试了类似的事情:

 > echo %TIME% ; dir ; echo %TIME

但它只打印了时间并没有执行命令dir

我该如何实现这个目标?


4
可能是 如何在 Windows 命令提示符中运行两个命令? 的重复问题。 - IvanRF
2个回答

200

使用:

echo %time% & dir & echo %time%
这个是记忆中相当于在bash和其他类Unix shell中使用分号分隔符的等价物。还有&&(或||),只有在第一个命令成功(或失败)时才执行第二个命令,但是单个&符号是你在这里要找的东西。
由于环境变量往往在读取而不是执行时被评估,因此这可能会给你相同的时间。您可以通过打开延迟扩展来解决此问题:
pax> cmd /v:on /c "echo !time! & ping 127.0.0.1 >nul: & echo !time!"
15:23:36.77
15:23:39.85

那需要从命令行中获取。如果您在脚本内部执行此操作,可以直接使用 setlocal

@setlocal enableextensions enabledelayedexpansion
@echo off
echo !time! & ping 127.0.0.1 >nul: & echo !time!
endlocal

1
这是因为环境变量在命令被“读取”时被评估,而不是执行时。我会更新答案。 - paxdiablo
问题仍然存在。脚本以代码1退出。但是第二个echo仍然打印相同的时间。请查看此输出:12:57:56.93 当3个线程正在运行时,一个线程已退出。12:57:56.93 - Raghuram
3
我倾向于使用 time /t(或 echo.|time)而不是 echo %time% 来规避这个问题。 - Joey
在看到你的答案之前,我编写了一个像这样的小批处理文件:echo %time% %* echo %time,并将需要执行脚本及其参数作为参数传递给此批处理脚本,并获得了所需的输出。 - Raghuram
1
有没有想法如何在以下调用中正确获取%errorlevel%? - BradLaney
显示剩余4条评论

0

也可以使用scriptrunner实现

ScriptRunner.exe -appvscript demoA.cmd arg1 arg2 -appvscriptrunnerparameters -wait -timeout=30 -rollbackonerror -appvscript demoB.ps1 arg3 arg4 -appvscriptrunnerparameters -wait -timeout=30 

还具有回滚、超时和等待等一些功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接