【问题标题】:Running a Curl Command from C#从 C# 运行 Curl 命令
【发布时间】:2020-06-15 15:13:52
【问题描述】:

我正在尝试从 C# 程序运行 curl 命令。我的代码如下。当我运行下面的代码时,我得到一个找不到文件的异常。我希望能够做到这一点,但我不想使用批处理文件作为文件名的参数。这是因为我的 curl 命令的参数会根据 C# 代码中的其他条件而变化。我的变量 strCmdText 具有 curl 命令的参数(源文件和目标文件)。 Stackoverflow 上还有其他示例,但它们都使用了我试图避免的批处理文件。

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "C:\\Windows\\System32\\curl.exe";
p.StartInfo.Arguments = strCmdText;
p.StartInfo.UseShellExecute = false;
p.Start();
p.WaitForExit();

我将代码更改为以下内容:

System.Diagnostics.ProcessStartInfo p = new 
    System.Diagnostics.ProcessStartInfo();
    p.UseShellExecute = true;
    p.WorkingDirectory = "C:\\Windows\\System32\\";
    p.FileName = "curl.exe";
    p.ErrorDialog = true;
    p.CreateNoWindow = true;
    System.Diagnostics.Process.Start(p);

在 DOS 提示符下,此目录中确实存在 curl。但我仍然收到 curl not found 消息。 这里的路径一定很奇怪。但是,当我在其中设置断点并查看 Environment 类时,System32 在路径中。

【问题讨论】:

  • 100 万美元的问题...您确定 C:\Windows\System32\curl.exe 存在吗?那将是一个非常奇怪的地方......
  • 如果您想发出 HTTP 请求,使用 HttpClient 并直接调用会快得多。你可以用where curl找到curl在哪里
  • 另外,虽然curl 可以做很多事情,但请考虑一下,如果您尝试做的事情也不能通过WebClient 的简单应用来完成(.DownloadFile 等)
  • curl 在我机器上的那个位置。我认为找不到的文件与您的论点有关。
  • 你能告诉我们strCmdText的值吗?

标签: c# command-line


【解决方案1】:

Curl 在以下位置可用:C:\Windows\System32\curl.exe

这只会使源文件成为“找不到文件”问题的罪魁祸首。

当您通过进程启动 curl 时,请确保您的路径在启动参数中正确转义。

或者,您可以通过 cmd(通过进程)启动 curl,您可以尝试以下操作,将命令行参数从 --help 更改为适合您所需的操作。

string script = $"\"C:\\Windows\\System32\\curl.exe\" --help";

Process process = new Process()
{
    StartInfo = new ProcessStartInfo()
    {
        FileName = "cmd",
        Arguments = script
    }
};

process.Start();

请注意,原则上这是使用批处理文件,因为它只是将一些命令放入 cmd。

【讨论】:

  • 有趣,实际的错误文本是“系统找不到指定的文件”。这个异常似乎来自 C# 库。如果它来自 curl 因为源文件不存在,我认为它的格式会有所不同,因为我觉得我以前从 C# 看到过这条消息。
  • @Carl 你确定你有 curl 在指定的位置,然后在活动的开发机器上?尝试将 C:\Windows\System32\curl.exe 放入常规 cmd,看看 curl 是否真的启动。
  • 是的,它确实从命令提示符启动。整个命令在命令提示符下也可以正常工作;按原样发送文件
【解决方案2】:

我遇到了完全相同的问题。只需从 System32 中删除 curl.exe 并将其放在另一个文件夹中(不要忘记依赖项、dll 等)。

然后在一行

p.StartInfo.FileName = "C:\\Windows\\System32\\curl.exe";

"C:\\Windows\\System32\\curl.exe" 覆盖为"C:\\NEW PATH\\curl.exe"

注意:您必须从 System32 中删除它。如果你只是复制到新位置,它仍然不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 2021-10-26
    • 2016-04-08
    • 1970-01-01
    相关资源
    最近更新 更多