代码之家  ›  专栏  ›  技术社区  ›  ufukgun

由于工作目录,系统(“c:\\sample\\startall.bat”)无法运行?

  •  1
  • ufukgun  · 技术社区  · 16 年前

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

    可执行文件在一个文件夹中,比如“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 回复  |  直到 16 年前
        1
  •  7
  •   heijp06    16 年前

    呼叫 chdir("C:\\sample") 打电话之前 system(...)

    或者放一个 cd 批处理文件中的命令

    编辑

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

    C:
    cd \sample
    

    编辑2

    使用johannes和matth提出的建议,一个更好的BAT文件版本将从以下内容开始

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

    现在,BAT文件将工作,不管它在哪个目录中,因为没有硬编码路径。setlocal用于避免运行脚本的副作用(如更改目录或设置环境变量)

        2
  •  7
  •   RichieHindle    16 年前

    这个 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 .

        3
  •  4
  •   MattH    16 年前

    如果我只打算使用与批处理文件相关的路径,那么我通常会让批处理文件忽略调用方的工作目录。您可以在文件开头使用以下方法执行此操作:

    SET BATDIR=%~dp0
    CD %BATDIR%
    

    或者您可以在调用外部文件时使用%batdir%。

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

        4
  •  0
  •   dudewat    16 年前

    尝试使用双斜杠

    
    system("c:\\sample\\startAll.bat");
    
    推荐文章