Alt*_*F4_ 51 command-line cmd batch-file call
如果从bat文件内部调用了另一个批处理文件但仍有一些剩余的操作要完成,那么如何确保对第一个bat文件的调用将在完成或错误之后,将返回到第一个调用它的文件中实例?
例:
CD:\MyFolder\MyFiles
Mybatfile.bat
Copy afile toHere
Run Code Online (Sandbox Code Playgroud)
要么
CD:\MyFolder\MyFiles
CALL Mybatfile.bat
COPY afile toHere
Run Code Online (Sandbox Code Playgroud)
什么是两者的区别CALL或START或者他们都不在呢?这会对是否会返回复制命令的结果产生影响吗?
dbe*_*ham 59
正如其他人所说,CALL是在.bat中调用另一个bat文件并返回调用者的正常方法.
但是,如果CALLed批处理文件具有致命的语法错误,或者如果CALLed脚本在没有/ B选项的情况下以EXIT终止,则所有批处理文件处理将停止(控制将不会返回到调用方).
如果通过CMD命令执行第二个脚本,则可以保证控制权将返回给调用者(只要控制台窗口保持打开状态).
cmd /c "calledFile.bat"
Run Code Online (Sandbox Code Playgroud)
但是这有一个限制,即被调用批处理设置的环境变量在返回时不会被保留.
我不知道在所有情况下都能保证返回并保持环境变化的良好解决方案.
如果您确实需要在使用CMD时保留变量,那么您可以让"被调用"脚本将变量更改写入临时文件,然后让调用者读取临时文件并重新建立变量.
jeb*_*jeb 35
call对于.bat或.cmd文件是必需的,否则控件将不会返回给调用者.
对于exe文件,它不是必需的.
Startcall它不同,它创建一个新的cmd.exe实例,因此它可以异步运行一个被调用的批处理文件
小智 10
`CALL'语句是在MS-DOS 3.3中引入的
它用于调用批处理文件中的其他批处理文件,而不会中止调用批处理文件的执行,并对两个批处理文件使用相同的环境.
所以在你的情况下,解决方案是使用 CALL
好吧,实际上我什至没有真正考虑过这样一个事实,即如果您调用批处理(无论“类型”如何,即“.bat”或“.cmd”),如果您不调用它就不会返回使用调用。
尽管出于不同的原因,我一直在使用 call 自己,实际上我很惊讶没有其他人提起。也许我错过了。也许我是世界上唯一一个知道的人!!:O
可能不会,但我会在这里放弃这些知识,因为它非常有用。
如果您使用 call,您可以使用二元逻辑运算符根据 ERRORLEVEL 结果决定如何进行。事实上,我总是对 && 和 || 存在于 DOS 中,不能以这种方式使用。嗯,这就是为什么。
测试这个最简单的方法是return.cmd用记事本创建一个,或者像这样从命令提示符创建:
c:\> type con >return.cmd
Run Code Online (Sandbox Code Playgroud)
您现在会注意到光标向下移动到下一行并挂起。进入:
@exit /B %1
Run Code Online (Sandbox Code Playgroud)
然后点击ENTER,然后CTRL-Z将创建该文件。好的!您现在可以随意尝试以下两个示例:
call return.cmd 0 && echo Huzzah! A Complete Success! (Or cover up...)
call return.cmd 123 || echo Oops! Something happened. You can check ERRORLEVEL if you want the tinest amount of additional information possible.
所以呢?好吧,在 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%
)
Run Code Online (Sandbox Code Playgroud)
(注意||第二个“回声”之前部分中的“呼叫” 。我相信这就是人们在当天没有延迟扩展的方式。如果您确实启用了延迟扩展(通过 .setlocal EnableDelayedExpansion 批量或启动一个命令提示符,cmd /v:on然后你可以做 !ERRORLEVEL!.)
......这是我必须道歉并说如果你if ERRORLEVEL过去有创伤你应该停止阅读的地方。我得到它。相信我。我想过在 Fiverr 上付钱给某人远程为我打字,但为了完整起见,我只想为团队拿一个,并提到您还可以执行以下操作来检查错误级别:
if ERRORLEVEL 123 @echo QUICK! MOTHERS, COVER YOUR CHILDREN'S EYES! FINGERS ARE BEING UNDONE! :'(
Run Code Online (Sandbox Code Playgroud)
如果您以前从未输入过,那么 GOOD!您将活得更久,而无需了解为什么您没有得到预期的结果。残酷是您要寻找的词,而不是“古怪”。
然而,我真正想了解的重要部分是,如果您尝试这样做并且不要使用“call”,它将始终执行“true”分支。自己试试吧!
如果我遗漏了什么,或者你知道更好的方法来做到这一点,请告诉我。我喜欢学习这样的东西!
我提到的其他信息:
我早就知道你可以在命令之前放置重定向,如下所示:
>nul echo. This won't be displayed!
Run Code Online (Sandbox Code Playgroud)
但前几天我偶然发现了一个笨蛋,你显然也可以这样做:
echo A B>file.txt C
Run Code Online (Sandbox Code Playgroud)
真的很惊讶地发现一个file.txt由“AB C”组成的。看起来你可以把它们放在任何地方,甚至在命令里面。我从来没有见过任何人这样做,也没有提到它,但我看到人们提到你可以在一行前加上他们。
也许这是 Windows 10 独有的错误或其他东西。如果您有另一个版本并想尝试一下并告诉我,我会对您发现的内容感兴趣。
保持书呆子!
| 归档时间: |
|
| 查看次数: |
63672 次 |
| 最近记录: |