【问题标题】:Running command line from C从 C 运行命令行
【发布时间】:2014-11-07 23:04:43
【问题描述】:

我正在运行 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 文件时。

【问题讨论】:

标签: c command-line command-prompt


【解决方案1】:

在 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);
} 

【讨论】:

    【解决方案2】:

    在 Windows 下,'cd' 是 shell 中的内置命令。您需要运行一个 shell 来执行它。 也请查看this answer

    编辑:您可以使用系统命令来运行这样的外壳:

    system("<fullpath to cmd.exe>\\cmd.exe /c \"your command here\"");
    

    除非您在 /c 之后运行单个可执行文件,否则转义引号会变得非常棘手。如果您的可执行文件或内部 shell 命令需要参数,您可能需要对引号进行两次和三次转义。对于一些特殊字符,如 | &&(管道)>(重定向)你需要使用微软为此目的添加的特殊 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 的信息。谢谢!
    • 非常感谢您的帮助,但仍然无法正常工作。我可以从命令提示符运行它,它会正常工作,但我希望能够将它作为 .exe 文件运行。我必须包含一个特定的库吗?
    • 我使用 "\"c:/Windows/System32/cmd.exe\"" 代替原始代码中的 "cd c:/" 编译了上述代码。如果我从 cywin 命令提示符运行 .exe,它会编译并运行良好。但是,如果我从常规 cmd.exe 运行它,或者只是通过双击 .exe 来运行它,它不会打开 cmd.exe。这是为什么呢?
    • 即从cygwin运行.exe会在cygwin中打开命令提示符。但是,从命令提示符运行 .exe 会打印“127”错误消息并冻结命令提示符(我什至无法使用 ctrl+c 转义)。运行 .exe 只会打印“127”错误并等待我关闭它。
    • 我不太会使用 cygwin 进行构建,但我认为如果没有 cygwin shell 和环境设置,找不到某些所需的库
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多