在批处理文件中包含批处理文件

时间:2010-09-29 11:12:57

标签: c# batch-file

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


call include.bat  

//execute the rest of the batch file here  

include.bat文件设置路径,可以被许多其他批处理文件使用。当我运行Process.Start时,有时这会有效,有时我会得到ERROR: cannot find include.bat。首先,任何想法为什么会发生这种情况?关于如何从批处理文件中解决这个问题的想法?

5 个答案:

答案 0 :(得分:6)

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

cd %~dp0

我几乎在所有批处理脚本中都这样做。这样,相对路径应始终有效。

答案 1 :(得分:2)

在脚本之前,请尝试CD /D %~dp0

答案 2 :(得分:1)

我要尝试的第一件事是在include.bat的call语句中使用完整路径信息。如果修复它,您可能只是没有从正确的位置运行批处理文件。我确信在C#中有一个“工作目录”功能,我只是不确定它是什么。

答案 3 :(得分:1)

您是否在传递给Process.Start的ProcessStartInfo上设置了ProcessStartInfo.WorkingDirectory(http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.workingdirectory.aspx)?

由于有时无法找到include.bat,因此工作目录可能有误(不是include.bat所在的文件夹)。

答案 4 :(得分:1)

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

更好的通用方法是通过完整路径引用依赖关系:

call "%~dp0include.bat"

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

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

  1. 批处理文件的其余部分仍然可以使用原始工作目录。
  2. 即使没有“SETLOCAL”,也会保留命令提示符中的原始工作目录。
  3. 如果第一个批处理文件是通过UNC路径运行的(例如“\\ server \ share \ file.bat”),则完整路径调用将在changing the directory (even with "cd /d") will fail时成功。 (使用pushd / popd可以处理这一点,但是它们有各自的问题。)
  4. 这些好处对于别名类型的批处理文件尤其重要,即使它们对于激发此问题的特定情况并不重要。