在C语言中运行命令行

5

我正在使用Windows 8操作系统,并使用cygwin编译我的代码。我尝试使用system()命令运行命令行命令。这似乎很简单,但令人惊讶的是,我找不到任何相关信息。以下是我的代码:

#include <stdio.h>
#include <string.h>

int main ()
{
    char command[50];
    int error = 0;

    strcpy( command, "cd c:/");
    error = system(command);
    printf("%s\n", command);
    printf("%d\n", error);
    while(1)
    {
        ;
    }

    return(0);
} 

然而,上述程序只返回变量错误为“127”,变量命令为“cd c:/”。一些谷歌搜索退出代码显示,“127”表示未找到该命令。我完全迷失了。我已经搜索了一段时间,但我只能找到与C#相关的问题。如何从C程序运行命令行命令?
编辑:我尝试从cygwin命令行运行程序,它可以正常运行。但是当我从普通的cmd.exe和双击.exe文件时,它就无法正确运行。

谢谢提供链接!然而,它仍然没有解决为什么没有任何命令似乎能够工作的问题。 - Anand Rajamani
2个回答

6
在Windows中,“cd”是shell中的内置命令。您需要运行一个shell才能执行它。 请参考这个答案。 编辑:您可以使用system命令像这样运行shell:
system("<fullpath to cmd.exe>\\cmd.exe /c \"your command here\"");

如果你在/c之后运行单个可执行文件,那么转义引号可能会变得非常棘手。如果您的可执行文件或内部shell命令需要参数,则可能需要两次或三次转义引号。对于一些特殊字符如| && (pipes) > (redirection),您需要使用Microsoft为此目的添加的特殊Windows ^转义字符。

这里有一个这样的命令示例。这个命令在小延迟后重新启动Windows:

system("cmd.exe /c \"start /b shutdown -t 1 -r\"");

这是一个更复杂的例子,包含特殊的转义字符:

system("cmd.exe /c \"ipconfig ^| find \"IPv4\" ^> C:\Users\someUser\a.txt ^&^& for /f \"tokens=13 delims=: \" %%i in (C:\Users\someUser\a.txt) do echo %%i ^> C:\Users\someUser\ip.txt ^&^& del C:\Users\someUser\a.txt\"");

这个代码可以使用简单的命令获取机器的IP地址,并以迂回的方式将其保存到名为“someUser”的用户主目录下的ip.txt文件中。请注意,此处使用了^转义符。

这很有道理。然而,该链接并没有真正回答如何实现我的目标。我会去搜索一些关于如何在C语言中打开shell的信息。谢谢! - Anand Rajamani
非常感谢您的帮助,但它仍然无法正常工作。我可以从命令提示符中运行它,并且它可以正常工作,但我想能够将其作为.exe文件运行。是否需要包含特定的库? - Anand Rajamani
我使用 ""c:/Windows/System32/cmd.exe"" 替换了原始代码中的 "cd c:/",并编译了上述代码。如果我从cywin命令提示符中运行.exe文件,则可以成功编译和运行。但是,如果我从常规cmd.exe中运行它,或者只是双击.exe文件,它将无法打开cmd.exe。为什么会这样? - Anand Rajamani
也就是说,从cygwin运行.exe会在cygwin中打开命令提示符。然而,从命令提示符运行.exe会打印“127”错误消息并冻结命令提示符(我甚至无法使用ctrl+c退出)。运行.exe只会打印“127”错误并等待我关闭它。 - Anand Rajamani
我不常使用Cygwin来构建,但我猜想如果没有Cygwin的shell和环境设置,可能会找不到某些必要的库。 - DNT
我最终只使用Unity C#编辑器进行编译和运行。毕竟这是用于游戏开发的,所以长期来看使用Unity引擎可能更好。Unity对此很好用。非常感谢您的帮助! - Anand Rajamani

0
在Kali中,系统还需要stdlib库来执行。 对于那些想要完整代码进行复制粘贴的人来说:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main ()
{
    char command[50];
    int error = 0;

    strcpy(command, "cd c:/");
    error = system(command);
    printf("%s\n", command);
    printf("%d\n", error);
    return(0);
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接