系统(“c:\\ sample \\ startAll.bat”)因工作目录无法运行?

时间:2009-09-03 11:41:11

标签: c++ batch-file system working-directory

我有一个应用程序和可执行文件。我希望我的应用程序运行我的可执行文件。

可执行文件位于文件夹中,例如“c:\ sample”。

在这个目录中有一个调用我的exe的批处理文件。像:

start a1.exe
start a2.exe
start a3.exe

让我们将其命名为startAll.bat

并假设每个exe都有一个像a1.dat a2.dat这样的数据......这些数据文件都在这个exe附近。

我想通过我的应用程序调用此批处理文件。

system("c:\\\\sample\\\\startAll.bat");

当我这样称呼它时,命令找不到这些exe。

如果我将目录名添加到批处理文件中,则无法找到该时间的数据。 我认为这是因为工作目录。

start c:\sample\a3.exe

如何在调用此批处理文件之前更改工作目录?

或者你还有别的建议吗?

4 个答案:

答案 0 :(得分:7)

在致电chdir("C:\\sample")

之前致电system(...)

或者在批处理文件中放置cd命令

修改

由于您不在C上:批处理脚本的第一行应该是

C:
cd \sample

<强> EDIT2

使用Johannes和MattH提出的建议,一个更好的BAT文件版本将从这样的东西开始

setlocal
set BATDIR=%~dp0
cd /d %BATDIR%

现在bat文件无论其所在的目录如何都能正常工作,因为没有硬编码路径。 SETLOCAL用于避免运行脚本的副作用(如更改目录或设置环境变量)

答案 1 :(得分:7)

system函数可以执行以下多个命令:

system("C: && cd \\sample && startAll.bat");

这比更改调用进程的当前工作目录更简洁,因为它可能有自己不需要的副作用。

根据您设置这些文件的方式,可能比将cd命令硬编码到批处理文件中更简洁。

编辑:我用这样的C程序对此进行了测试:

#include "stdafx.h"
#include <stdlib.h>

int _tmain(int argc, _TCHAR* argv[])
{
    system("C: && cd \\temp && test.bat");
    return 0;
}

和一个名为C:\temp\test.bat的批处理文件,如下所示:

echo "Hello world" > pog

当我运行该C程序(在与c:\ temp不同的目录中)时,pog中出现了一个名为C:\temp的文件。

答案 2 :(得分:4)

如果我只打算使用相对于批处理文件的路径,我通常更喜欢让我的批处理文件忽略调用者的工作目录。您可以在文件开头使用以下命令执行此操作:

SET BATDIR=%~dp0
CD %BATDIR%

或者,您可以在调用外部文件时%BATDIR%。

要了解上述工作原理,请查看here

答案 3 :(得分:0)

尝试使用双斜杠


system("c:\\sample\\startAll.bat");