【问题标题】:system("c:\\sample\\startAll.bat") cannot run because of working directory?system("c:\\sample\\startAll.bat") 由于工作目录而无法运行?
【发布时间】:2009-09-03 11:41:10
【问题描述】:

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

可执行文件在一个文件夹中,比如说在“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

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

或者你还有什么建议吗?

【问题讨论】:

  • system("C:\\sample\\...\\foo.bat");应该可以工作,所以这让我相信还有其他问题。您确定包含所有必要的库等吗?
  • 它可以工作,但批处理文件不会调用可执行文件,因为它找不到..
  • @ufukgun:正如彼得指出的那样,如果您的主要可执行文件位于 C 以外的驱动器上:答案会略有不同。我又更新了答案。
  • @RichieHindle:是的,它们在不同的驱动器上......嗯......我认为这就是问题......

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


【解决方案1】:

在拨打system(...)之前先拨打chdir("C:\\sample")

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

编辑

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

C:
cd \sample

EDIT2

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

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

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

【讨论】:

  • 实际上当我通过系统调用它时它不起作用(“c:\\sample\\startAll.bat”),它只有在我手动从cmd调用它时才起作用..所以它是仍然没有答案...
  • 您的可执行文件是否在 C: 驱动器上?如果不是,您还应该发出驱动器号更改
  • 是的,彼得,你是对的。但我怎样才能改变我的驱动器号。它不接受在批处理文件或系统中调用“c:\”
  • 您可以使用CD /D C:\sample同时更改驱动器和目录。
【解决方案2】:

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 不同的目录中),果然在 C:\temp 中出现了一个名为 pog 的文件。

【讨论】:

  • @ufukgun:我对此进行了测试,它非常适合我。一定有其他原因它不适合你。
  • 实际上从批处理文件中调用 cd 也不起作用..我也希望您的解决方案有效,但它没有..我不明白为什么... :(
【解决方案3】:

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

SET BATDIR=%~dp0
CD %BATDIR%

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

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

【讨论】:

    【解决方案4】:

    试试双斜线

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

    【讨论】:

    • 事实并非如此.. 可执行文件正在应用程序的工作目录中查找数据.. 不在此可执行文件附近..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多