在批处理文件中包含另一个批处理文件

6

我在尝试使用Process.Start运行所有内容时,遇到了从另一个批处理文件中调用批处理文件的问题。基本上,我从我的C#程序中调用批处理文件的执行,如下所示:


call include.bat  

//execute the rest of the batch file here  

include.bat文件设置路径,可以被许多其他批处理文件使用。当我运行Process.Start时,有时候它可以正常工作,有时候会出现ERROR: cannot find include.bat错误。首先,你知道为什么会发生这种情况吗?你有没有任何关于如何从批处理文件中修复这个问题的想法?

5个回答

6

要切换到批处理文件所在的目录,请使用以下命令:

cd %~dp0

我几乎在所有批处理脚本中都会这样做。这样相对路径应该总是有效。


2
我通常设置一个变量,以使脚本更易于阅读:SET CDIR =%〜dp0 - djangofan
1
基本上是一个不错的解决方案,但它不能处理网络路径。@mattias-andersson的解决方案(在需要时传递调用路径)将在所有情况下都有效。 - FaultyOverflow

3

我知道这是一个老问题,但是我认为值得注意的是,接受的答案所提倡的方法(即更改工作目录)可能并不总是适当的。

一个更好的通用方法是通过完整路径引用依赖项:

call "%~dp0include.bat"

(由于%~dp0已经以反斜杠结尾,我们不需要再添加一个了。)

以下是不更改工作目录的一些好处:

  1. 批处理文件的其余部分仍然可以使用原始的工作目录。
  2. 即使没有"SETLOCAL",命令提示符中的原始工作目录也会被保留。
  3. 如果第一个批处理文件通过UNC路径运行(例如"\\server\share\file.bat"),完整路径调用将成功,而更改目录(即使使用"cd /d")也会失败。(使用pushd/popd可以处理此点,但它们有自己的问题。)

这些好处对于别名类型的批处理文件特别重要,即使它们对于激发这个问题的具体情况不那么重要。


2
在执行脚本之前,尝试运行CD /D %~dp0

1
你说得有道理。如果意味着要切换到另一个驱动器,那么这张光盘可能无法工作,但是使用 /D 开关,也许就可以了。我没有尝试过,但这是个好想法... - djangofan

1

我会尝试在调用include.bat时使用完整的路径信息。如果这样做可以解决问题,那么你可能只是没有从正确的位置运行批处理文件。我相信C#中有一个“工作目录”的功能,只是我不确定它是什么。


1

我必须承认我不会这样做。有没有办法从批处理文件中至少暂时修复它? - Dimitris
请按照Botz3000的建议使用cd %~dp0。 - Andreas Paulsson

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