示例:
CD:\MyFolder\MyFiles
Mybatfile.bat
Copy afile toHere
或者CD:\MyFolder\MyFiles
CALL Mybatfile.bat
COPY afile toHere
使用CALL
或START
,或者不使用它们之间有什么区别?这会对复制命令是否返回结果产生影响吗?
CD:\MyFolder\MyFiles
Mybatfile.bat
Copy afile toHere
或者CD:\MyFolder\MyFiles
CALL Mybatfile.bat
COPY afile toHere
使用CALL
或START
,或者不使用它们之间有什么区别?这会对复制命令是否返回结果产生影响吗?
正如其他人所说,CALL
是在 .bat 文件中调用另一个批处理文件并返回给调用者的常规方式。
然而,如果被调用的批处理文件存在致命语法错误,或者调用的脚本在没有 /B 选项的情况下以 EXIT 结束,所有批处理文件的处理都将停止(控制将不会返回给调用者)。
如果您通过 CMD 命令执行第二个脚本,则可以保证控制权将返回给调用者(当然只要控制台窗口保持打开状态)。
cmd /c "calledFile.bat"
但这有一个限制,即由被调用批处理程序设置的环境变量在返回时不会被保留。
我不知道有什么好的解决方案可以保证在所有情况下都能返回并保留环境更改。
如果您确实需要在使用CMD时保留变量,则可以让“被调用”的脚本将变量更改写入临时文件,然后让调用者读取临时文件并重新建立变量。
cmd /c
和CALL
之间的区别非常有启发性:http://www.robvanderwoude.com/call.php - Rabarberskicall
、start
还是直接运行第二个批处理文件,第一个批处理文件设置的所有环境变量都将对第二个批处理文件可用。 - smwikipediacall
命令对于.bat或.cmd文件是必需的,否则控制权将不会返回给调用者。
对于exe文件,它并不需要。
start
和call
不同,它会创建一个新的cmd.exe实例,因此可以异步地运行一个“被调用”的批处理文件。
`CALL'语句是在MS-DOS 3.3中引入的。
它用于在批处理文件中调用其他批处理文件,而不会中止调用批处理文件的执行,并为两个批处理文件使用相同的环境变量。
所以在您的情况下,解决方案是使用CALL
。
好的,实际上我并没有考虑过一个批处理文件(无论其类型是.bat还是.cmd)如果不使用call命令调用就不会返回。
但我自己一直在使用call命令,原因不同,我很惊讶竟然没有人提到过。也许我错过了。也许我是世界上唯一知道这个的人!:O
可能不是,但我要在这里分享这个非常有用的技巧。
如果你使用call命令,你可以使用二进制逻辑运算符根据ERRORLEVEL结果来决定如何继续执行。实际上,在DOS和COULDN'T中存在 && 和 || 运算符,不能以这种方式使用,这是最令人吃惊的。
测试这个技巧最简单的方法是使用记事本创建一个return.cmd
文件,或者从命令提示符中这样做:
c:\> type con >return.cmd
@exit /B %1
call return.cmd 0 && echo 好极了!完全成功!(或掩盖...)
call return.cmd 123 || echo 哎呀!出了点问题。如果您想获得最少量的附加信息,可以检查ERRORLEVEL。
那又怎样呢?嗯,将0和123交换后再次运行它们,您应该会发现消息不会打印出来。
也许这个多行示例会更有意义。我经常使用它:
call return.cmd 0 && @(
echo Batch says it completed successfully^^!
) || @(
echo Batch completed, but returned a 'falsey' value of sort.
call echo The specific value returned was: %ERRORLEVEL%
)
||
部分中出现了“call”。我相信这就是当时人们解决没有延迟扩展的方法。如果您启用了延迟扩展(通过批处理中的setlocal EnableDelayedExpansion OR使用cmd /v:on
启动命令提示符),则只需执行!ERRORLEVEL!即可。)if ERRORLEVEL
的创伤,你应该停止阅读的地方。我明白的。相信我。我考虑过在fiverr上支付某人为我远程输入这个内容,但为了完整起见,我会为团队做出贡献,并提到您也可以执行以下操作来检查errorlevel: if ERRORLEVEL 123 @echo QUICK! MOTHERS, COVER YOUR CHILDREN'S EYES! FINGERS ARE BEING UNDONE! :'(
如果你之前从未打过这个命令,那太好了!你将长寿而不必阅读为什么没有得到期望结果的原因。正确的词汇是“残酷”,而不是“奇怪”。
然而,我想要传达的重要部分是,如果你尝试这样做但没有使用“call”,它将始终执行“true”分支。你可以自己试试!
如果我漏掉了什么,或者你知道更好的方法,请告诉我。我喜欢学习这样的东西!
我提到的额外信息:
我已经知道一段时间了,你可以在命令前放置重定向,就像这样:
>nul echo. This won't be displayed!
echo A B>file.txt C
file.txt
的文件,里面包含了"A B C"。看起来你可以把它们放在任何地方,甚至是命令内部。我从未见过有人这样做,也没有听说过,但我确实见过人们提到可以在行首加上它们。