如何在一个bat文件中运行多个带有RootPath的bat文件

3
我想运行一个批处理文件,它启动其他4个批处理文件。 问题是:只有第一个CMD文件被执行。 我看了这里发布的类似问题:如何在.bat文件中运行多个.bat文件 还有这里:如何从一个批处理文件启动多个带依赖关系的批处理文件? 我的问题与之不同的是,我为每个CMD文件传递一个RootPath。
Examples given in other posts: 
call msbuild.bat
call unit-tests.bat
call deploy.bat

My code:
SET RootPath="G:\Dev Folder\Framework\MainFolder\SubFolder\JOBS\"
CALL %RootPath%Account.CMD
CALL %RootPath%Customer.CMD
CALL %RootPath%Contract.CMD
CALL %RootPath%Location.CMD

这个Master.CMD文件包含的代码不在同一个目录下,与Account / Customer / Contract / Location cmd文件不在同一目录下,这就是为什么我要传递绝对路径的原因。 第一个命令运行得很好。然后我收到了错误提示:
'..\Customer.CMD ' is not recognized as en internal or external command, operable program or batch file.
'..\Contract.CMD ' is not recognized as en internal or external command, operable program or batch file.
'..\Location.CMD ' is not recognized as en internal or external command, operable program or batch file.

在stackoverflow上,我无法从其他批处理帖子中推导出解决方案。我对这种语言还很陌生,请原谅我如果我忽略了什么。

任何形式的帮助都是受欢迎的。


RootPath 中间有空格。尝试用引号运行 CALL "%RootPath%Account.CMD" - Thomas Weller
1
这看起来像是你的 ACCOUNT.CMD 重置了 RootPath。环境变量是全局的,除非你使用 setlocal 进行隔离。 - wmz
RootPath的值带有引号。 此外,将引号添加到CALL“%RootPath%Account.CMD”似乎无法解决问题。 - NetFlash
感谢@wmz。 感谢你和同事的贡献。 你的答案让我重新评估了问题。你能把你的评论作为答案吗? 路径被子包中的关键字“call”覆盖。通过使用关键字“call”,执行上下文被子CMD继承。因此,当Account.CMD更改“RootPath”时,它会反映回主文件夹,在那里下一个包被称为“..\Customer.cmd”,而不是G:[...]\Customer.cmd 解决方案是在Master.CMD中使用不同的变量名(MasterPath)。 - NetFlash
1个回答

1
这似乎是你的 Account.cmd 重置了 RootPath。环境变量是(会话)全局的,除非你使用 setlocal 进行隔离。为了解决问题,你可以更改名称(就像你所做的那样),或在批处理文件中使用 setlocal。这通常是一个好习惯,因为它有助于避免意外/不必要的副作用。 以下是来自 help setlocal 的引用:

开始在批处理文件中本地化环境更改。发出 SETLOCAL 命令后进行的环境更改将局部应用于批处理文件。必须发出 ENDLOCAL 才能恢复以前的设置。当到达批处理脚本的结尾时,对于由该批处理脚本发出的任何未完成的 SETLOCAL 命令,都会执行一个隐含的 ENDLOCAL。


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