【发布时间】: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退出,你的程序继续运行。但是改变 subshell 的当前目录是没有用的,因为它马上就退出了!您的程序的当前目录没有改变。使用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