2010-09-29 208 views
5

我尝试使用Process.Start尝试运行所有内容时,从另一个批处理文件调用批处理文件时出现问题。基本上,我叫一个批处理文件的执行,从我的C#程序,它看起来像这样:将批处理文件包含在批处理文件中


call include.bat 

//execute the rest of the batch file here 

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

回答

7

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

cd %~dp0 

我这样做几乎所有我的批处理脚本。这种方式相对路径应该始终工作。

+0

感谢那 – Dimitris 2010-09-29 11:25:14

+0

如果它解决了您的问题,您可以标记为答案。 :) – Botz3000 2010-09-29 11:28:04

+1

我通常设置一个变量,以便脚本更具人类可读性:SET CDIR =%〜dp0 – djangofan 2011-11-02 18:58:42

1

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

1

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

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

+0

我必须承认我不这么做。有没有办法从批处理文件中至少暂时修复它? – Dimitris 2010-09-29 11:22:03

+0

按照上述Botz3000的说明使用cd%〜dp0。 – 2010-09-29 11:23:16

+0

感谢那 – Dimitris 2010-09-29 11:24:32

2

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

+1

您的权利可能。如果这意味着切换到另一个驱动器盘符,但使用/ D开关,CD可能不起作用,也许它会。我没有尝试,但它是一个好主意...... – djangofan 2012-09-10 18:14:38

2

我知道这是一个老问题,但我认为这将是值得一提的是,由公认的答案晋升(即改变工作目录)的方法可能并不总是合适的。

更好一般方法是通过完整路径是指依赖关系:

call "%~dp0include.bat" 

(自%〜DP0已经与一个反斜杠结束,我们并不需要添加另外一个。)

这里是改变工作目录的一些好处:

  1. 批处理文件的其余部分仍然可以使用原始工作目录。
  2. 即使没有“SETLOCAL”,命令提示符中的原始工作目录也会保留。
  3. 如果第一个批处理文件通过UNC路径运行(例如“\\ server \ share \ file.bat”),全路径调用将成功,而changing the directory (even with "cd /d") will fail。 (使用PUSHD/POPD会处理这一点,但他们有自己的一套问题。)

这些好处是别名类型的批处理文件尤为重要,即使他们不是具体的情况作为重要的是,激发了这个问题。