2016-05-23 152 views
0

我有一个批处理文件,它改变了方向到一个特定的工具链,并执行一个命令是这样的:执行Windows命令用C

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"); 
+0

顺便说一句,你的'系统( “CD的东西”);'*没有*改变当前目录,但只通过'system'催生子shell当前目录。它的工作方式如下:你的程序产生了一个子shell,并在子shell中执行命令cd something。子外壳的当前目录已更改。然后退出子shell并且程序继续运行。但改变subshel​​l的当前目录是无用的,因为它刚刚退出!你的程序当前目录没有改变。使用'chdir',你改变你的程序的当前目录。 (但是,是的,CreateProcess是你所需要的) – CherryDT

+0

我用'chdir'实现了我的目的,它看起来很好。我将我的可执行文件移动到另一个目录,以查明它是否失败,但运行良好。你认为在某些情况下'chdir'会导致失败吗?我目前不使用'CreateProcess'。 –

+0

如果你使用'chdir',你至少应该在生成子进程后改回工作目录。事情是,'CreateProcess'方法用一个你传递给'CreateProcess'函数的特定工作目录来启动子进程。 'chdir'函数改变你自己程序的工作目录,然后产生子进程(继承你的程序的当前工作目录)。然而,你现在改变了你自己程序的当前目录,所以下次你用相对路径做任何事情时(例如'open('myfile。txt')')它可能会失败,所以你应该保存旧的目录并将它改回 – CherryDT

回答

3

你的程序有一些不正确的假设。首先,"cd""dir"不是程序,而是内置的命令,cmd.exe。其次,我怀疑你根本不需要改变当前目录。无论哪种方式,因为这是一个Windows系统,我会看看如何用CreateProcess()启动程序的例子。

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

而且

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

然后,我应该搜索CreateProcess选项。谢谢。此外,我发现这个相关的问题:http://stackoverflow.com/questions/24722368/systemcd-path-in-a-c-program –

+1

是CreateProcess选项和该线程中的答案也可以跟随 –