【问题标题】:Executing windows commands in C在 C 中执行 windows 命令
【发布时间】:2016-09-20 00:01:28
【问题描述】:

我有一个批处理文件,它将方向更改为特定工具链并执行如下命令:

cd C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin

avr-objcopy -O binary C:\Users\cinar\Desktop\hextobin\GccApplication.elf C:\Users\cinar\Desktop\hextobin\GccApplication.bin

我想用我的 C 应用程序来做这件事。我找到了this topic,尝试了system(); 命令,它可以部分工作。我可以这样称呼:

system("cd");

并找回方向。但我不能用这个命令改变它:

system("cd C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin");

这导致了一个关于未知转义的编译警告,所以我在转义中添加了\ 并尝试了这个:

system("cd C:\\Program Files (x86)\\Atmel\\Studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolchain\\bin");

我能够编译并运行它,但这并没有改变方向。

有没有可能用system() 执行我的命令?由于我只是想改变方向并执行一个命令,所以我想保持简单。

更新:后来我发现了这个话题: system("cd <path>") in a C program

然后用这个解决了我的问题:

chdir("C:\\Program Files (x86)\\Atmel\\Studio\\7.0\\toolchain\\avr8\\avr8-gnu-toolchain\\bin");

system("avr-objcopy -O binary C:\\Users\\cinar\\Desktop\\ff.elf C:\\Users\\cinar\\Desktop\\ff.bin");

【问题讨论】:

  • 顺便说一句,您的system("cd something"); 确实 更改了当前目录,但只有system 生成的子shell 的当前目录。它是这样工作的:你的程序产生了一个子shell,并在子shell中执行了命令cd something。子shell 的当前目录已更改。然后子shell退出,你的程序继续运行。但是改变 subshel​​l 的当前目录是没有用的,因为它马上就退出了!您的程序的当前目录没有改变。使用chdir,您可以更改程序的当前目录。 (但是是的,您需要 CreateProcess)
  • 我用chdir 实现了我的目的,看起来效果很好。我将我的可执行文件移动到另一个目录以查看它是否失败,但它运行良好。你认为chdir 在某些情况下会导致失败吗?我目前没有使用CreateProcess
  • 如果你使用chdir,你至少应该在你生成子进程后改回工作目录。问题是,CreateProcess 方法使用您传递给CreateProcess 函数的某个工作目录启动子进程。 chdir 函数改变你自己程序的工作目录,然后产生子进程(它继承你程序的当前工作目录)。但是,您现在更改了自己程序的当前目录,因此下次使用相对路径(例如open('myfile.txt'))执行任何操作时,它可能会失败,因此您应该保存旧目录并将其改回
  • 哦,现在我明白你的意思了。在我的代码开头改变了方向之后,我在进一步的道路上已经遇到了麻烦。我通过将第一个目录添加到所有新路径中解决了这个问题。但你说得对,我可以在完成工作后改变方向。那会更有意义。谢谢!
  • "The chdir function" 在我上面的评论中当然应该是 "The chdir method"。 chdir 不会产生任何东西。

标签: c windows batch-file cmd command


【解决方案1】:

您的程序有一些不正确的假设。首先,"cd""dir" 不是程序,而是shell 内置的命令cmd.exe。其次,我怀疑您根本不需要更改当前目录。

无论如何,由于这是一个 Windows 系统,我会看一个关于如何使用 CreateProcess() 启动程序的示例。

要更改当前目录,请查看CreateProcess() 调用的 lpCurrentDirectory 参数。

还有

system("dir Users\\whatEverNextFolder > test.txt");

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多