C++ 如何通过C++;节目?

C++ 如何通过C++;节目?,c++,C++,为了给大家提供一些帮助,我正在制作一个小程序,它将获取一个.SQL文件,并使用mysql.exe将其还原到用户localhost phpMyAdmin。手动通过MyAdmin导入文件需要花费很长时间,因为它必须解压和解析信息,这种方法更快,而且适合我的同事,因为我们总是将备份和恢复推送到WAMP进行实验 我面临的一个问题是,无论发生什么,我似乎都无法让它更改目录。我知道无论在哪里启动可执行文件都是系统将继承的路径,所以为什么我不能简单地告诉它更改目录呢 以下是我目前的代码: system("cd

为了给大家提供一些帮助,我正在制作一个小程序,它将获取一个.SQL文件,并使用mysql.exe将其还原到用户localhost phpMyAdmin。手动通过MyAdmin导入文件需要花费很长时间,因为它必须解压和解析信息,这种方法更快,而且适合我的同事,因为我们总是将备份和恢复推送到WAMP进行实验

我面临的一个问题是,无论发生什么,我似乎都无法让它更改目录。我知道无论在哪里启动可执行文件都是系统将继承的路径,所以为什么我不能简单地告诉它更改目录呢

以下是我目前的代码:

system("cd c:\wamp64\bin\mysql\mysql5.7.14\bin");
system("PAUSE");
system("dir");
system("PAUSE");
system("mysql.exe -u root -p dataBase < tables.sql");
system(“cd c:\wamp64\bin\mysql\mysql5.7.14\bin”);
系统(“暂停”);
系统(“dir”);
系统(“暂停”);
系统(“mysql.exe-u root-p数据库
注意:暂停和系统(“dir”)严格地用于测试目的,一旦窗口返回目录的正确内容,我就知道它工作了,我只剩下程序中的第一行和最后一行

更新:我收到通知,每次对系统的调用都会创建一个新的CMD进程,这对于cd为什么不会产生任何影响来说非常有意义,因为它正在打开一个新进程,更改目录,然后在下一行调用一个新进程并暂停。解决这个问题的方法是什么

更新2:我决定使用&&将多个命令连接在一起,但这限制了我在可用性和“样式化”方面的能力,但这不是问题,该程序需要作为运行和完成类型的交易

以下是我的想法:

system("cd c:\\wamp64\\bin\\mysql\\mysql5.7.14\\bin && mysql.exe -u root -p dataBase < table.sql");
cout << "\n" << "The database 'dataBase' has been restored using 'table.sql' successfully!" << "\n\n";
return 0;
system(“cd c:\\wamp64\\bin\\mysql\\mysql5.7.14\\bin&&mysql.exe-u root-p数据库cout一个更好的方法是动态生成一个批处理文件(
.cmd
.bat
),然后用
cmd.exe/c batchFile.cmd
调用该批处理文件:

#include <cstdlib>
#include <cstdio>

ofstream batch_file;
batch_file.open( "commands.cmd", ios::trunc );
batch_file <<
    "cd c:\\wamp64\\bin\\mysql\\mysql5.7.14\\bin" << endl <<
    "PAUSE" << endl <<
    "dir" << endl <<
    "PAUSE" << endl <<
    "mysql.exe -u root -p dataBase < tables.sql" << endl;
batch_file.close();

int batch_exit_code = system( "cmd.exe /c commands.cmd" ); // blocks until the child process is terminated
if( batch_exit_code != 0 ) {
    cout << "Batch file exited with code " << batch_exit_code << endl;
}

remove( "commands.cmd" ); // delete the batch file

以下是一种通过目录更改执行系统的方法:

// using AND_CMD like an operator to concat commands -- you can also just type it in one string: "edit & shutdown -h"...
// this works in c, too, but no dynamic variables are possible
//#define AND_CMD " & "

// c++
#define AND_CMD +" & "+

system(
    "cd c:\wamp64\bin\mysql\mysql5.7.14\bin" AND_CMD
    "PAUSE" AND_CMD
    "dir" AND_CMD
    "PAUSE" AND_CMD
    "mysql.exe -u root -p dataBase < tables.sql"
);
//像操作符一样使用AND命令来concat命令——您也可以在一个字符串中键入它:“edit&shutdown-h”。。。
//这也适用于c语言,但不可能使用动态变量
//#定义并_CMD“&”
//C++
#定义并_CMD+“&”+
系统(
“cd c:\wamp64\bin\mysql\mysql5.7.14\bin”和
“暂停”和_CMD
“dir”和_CMD
“暂停”和_CMD
“mysql.exe-u root-p数据库
因此,您只需要使用字符串
“&”
连接命令。
如果下次调用
系统
-函数时需要在程序自身/保留目录的条件下运行代码,则应寻找替代方法或将命令导入commandprompt(例如,通过
myprogram.exe |%comspec%
运行程序,并通过使用
printf
输出调用命令。请不要使用
system
。它有很多问题……1.您没有收到关于错误转义序列的警告吗?2.每次对系统的调用都会打开一个新的命令会话。因此,cd无效。W解决这个问题的方法是什么?在一个系统中完成所有工作()call.Lookup&&在你的cmd.exe引用中。非常好的信息!我读了CreateProcess,这似乎是一个比调用系统打开系统更可行的选择。现在,这不会导致问题,因为command.cmd文件将始终保留?或者每次迭代都会覆盖上一次吗?@Brian我修改了我的代码以删除它在文件被执行后删除文件。非常感谢你们!你们真是太棒了,15分钟内我得到了比我实际要求的更多的信息!我会尽我所能帮助其他人。回到主题,我更新了我原来的帖子,使用CreateProcess()有什么好处吗通过我对system的一次调用?第二个代码示例根本不起作用。请参阅
CreateProcess()的说明
参数
lpApplicationName
:对于部分名称,该函数使用当前驱动器和当前目录来完成规范。该函数不会使用搜索路径。或者只是为了保持舒尔:
#define and_CMD+string(&”)+
我真的看不出该宏的原因。
// using AND_CMD like an operator to concat commands -- you can also just type it in one string: "edit & shutdown -h"...
// this works in c, too, but no dynamic variables are possible
//#define AND_CMD " & "

// c++
#define AND_CMD +" & "+

system(
    "cd c:\wamp64\bin\mysql\mysql5.7.14\bin" AND_CMD
    "PAUSE" AND_CMD
    "dir" AND_CMD
    "PAUSE" AND_CMD
    "mysql.exe -u root -p dataBase < tables.sql"
);