调用.cmd文件会导致从父.cmd文件退出

时间:2014-03-18 10:51:01

标签: windows batch-file

我有一个.cmd文件调用另一个.cmd文件,如下所示

parent.cmd

call "C:\Program Files\Prog1\bin\dostuff.cmd" -abc="def"

def.cmd运行后,dos窗口跳到下一行,显示提示>

因此,根据命令提示符,parent.cmd文件已完成执行。但是,在调用dostuff.cmd之后,parent.cmd文件未完成,并且还有许多其他命令要运行。

dostuff.cmd设置了许多环境变量和别名,这些变量和别名是parent.cmd中其余命令所必需的。因此,dostuff.cmd必须在与parent.cmd相同的命令提示符下运行。

dostuff.cmd是由别人写的,并做各种我不知道的事情。如果我以上述方式调用我自己设计的其他.cmd文件,它会正确执行,然后parent.cmd文件继续执行,没有任何问题。

因此dostuff.cmd中的某些内容正在关闭parent.cmd的处理。任何想法可能是什么以及如何阻止/绕过它?

这是parent.cmd程序:

@echo off
:Begin

echo.hello
call "C:\Program Files\Prog1\bin\dostuff.cmd" -abc="def"
echo.goodbye

:End

输出

C:\Users\cowman\desktop>.\parent.cmd

hello
dostuff.cmd text...blah blah

C:\Users\cowman\desktop>

如您所见,不会调用echo.goodbye代码。

3 个答案:

答案 0 :(得分:2)

没有dostuff.cmd的列表,我们猜测。

我的专利猜测是dostuff.cmd本身会调用cmd。如果您要回复exit第二个提示,则应该返回给调用者(除非dostuff.cmd再次调用cmd

如果exit响应终止了cmd会话并关闭了窗口,那么这真是个谜。

答案 1 :(得分:1)

这听起来,当将流2重定向到nul时,批处理文件中的语法错误会退出doStuff.cmd

语法错误立即停止所有批处理实例/调用堆栈,但命令窗口保持打开状态。

我认为您的批处理文件的名称不是doStuff.cmd,而且参数也比-abc="def"更复杂。

正如您在评论中所说,该命令可以从命令行运行,但不能从您的父批处理中运行,我认为参数包含百分号或符号。

如果它们包含百分号,请尝试四倍它们 doStuff.cmd "printf("%d",1)"
将其转换为
call doStuff.cmd "printf("%%%%d",1)"

如果涉及到护理,请尝试

set "myCaret=^"
call doStuff.cmd "a caret%%myCaret%%"

答案 2 :(得分:0)

听起来像dostuff.cmd由于某种原因退出,这将导致整个cmd.exe退出。

它有“退出”命令吗?可以尝试更改为“退出/ B”以退出脚本而不是cmd.exe