【问题标题】:Running complex command line from C#从 C# 运行复杂的命令行
【发布时间】:2014-05-24 13:33:47
【问题描述】:

我正在尝试从 C# 运行以下命令行:

Process.Start("C:\\Program Files\\GoToTags\\GoToTags Encoder\\GoToTags.Encoder.exe --records "{'Url':'http://petshop.intato.com/index.php?id='" + TxtBoxIDCode.Text + "'','RecordType':'Website'}"");

显然它不起作用。

问题是我需要保留正确的标志,例如:才能使其正常工作。

原来的命令是:

C:\Program Files\GoToTags\GoToTags Encoder\GoToTags.Encoder.exe --records "{'Url':'http://petshop.intato.com/index.php?id=29','RecordType':'Website'}"

我必须运行该命令,同时将 29 替换为文本框的内容

有人能帮我解决这个问题吗?

【问题讨论】:

    标签: c# process.start


    【解决方案1】:

    string.Format 命令是你的朋友...

    string path = @"C:\Program Files\GoToTags\GoToTags Encoder\GoToTags.Encoder.exe";
    string args = string.Format("--records \"{'Url':'http://petshop.intato.com/index.php?id={0}','RecordType':'Website'}\"", TxtBoxIDCode.Text);
    Process.Start(path, args);
    

    【讨论】:

    • 路径中包含空格,所以要在字符串中加引号。
    • 在第二次阅读时,情况更糟:Process.Start(string) 只允许一个命令 - 它不允许该字符串中的参数。 (或者不根据the MSDN article
    • 你是对的,你必须使用两个字符串或一个 processtartinfo 的覆盖
    【解决方案2】:

    你有几个陷阱在等着你。

    首先,正如您已经发现的那样,路径名中的反斜杠会导致字符串出现问题,因为它们也可能表示 C# 转义序列。对文件名使用 C# 的 @"..." 语法通常是一种好习惯,部分原因是为了避免需要将反斜杠加倍并使其更易于阅读,部分原因是您可能会无意中在其中留下 \t 并且它会被忽视年龄。

    其次,对Process.Start 的单参数调用只需要一个命令——它不能接受命令参数——所以你必须调用双参数重载。

    第三,records 参数值周围的引号需要处理,以便 C# 语法知道您想要它们做什么 - 即将它们传递给命令。我已将命令参数分成两部分以使其更清晰。我选择使用反斜杠来转义它们,尽管使用替代品 @"...""..." 也一样好,而且选择很大程度上取决于个人喜好,除非上下文强烈指出你是一种方式而不是另一种方式。

    string cmd = @"C:\Program Files\GoToTags\GoToTags Encoder\GoToTags.Encoder.exe";
    string url = "http://petshop.intato.com/index.php?id=" + TxtBoxIDCode.Text;
    string cmdArgs = "--records \"{'Url':'" + url + "','RecordType':'Website'}\"";
    Process.Start(cmd, cmdArgs);
    

    [编辑添加:]

    如果由于某种原因您发现您想要或需要使用string.Format 来帮助构建您的cmdArgs,那么还有第四个问题在等着您,string.Format 会寻找大括号 (@987654330 @ 和 }) 字符来分隔插入参数规范,但您的 records 命令行参数需要字符串中的大括号字符。实现这一点的方法是将您想要的大括号加倍,如下所示:

    string cmdArgs =
        string.Format("--records \"{{'Url':'{0}','RecordType':'Website'}}\", url)";
    

    【讨论】:

      【解决方案3】:

      除了其他答案,您应该使用Process.Start 的两个参数重载。第一个参数是可执行文件,第二个参数是命令行参数。


      通常,如果您坚持使用单个参数调用,您应该用双引号将您的可执行文件括起来,如下所示:
      "\"C:\\Program Files\\GoToTags\\GoToTags Encoder\\GoToTags.Encoder.exe\" ...arguments here..."
      

      但是,这种形式Process.Start(string) 不起作用,因为它明确禁止这样做。

      【讨论】:

      • Process.Start 的单参数重载不允许命令行参数。您需要使用双参数重载。或者,正如 dbugger 指出的那样,带有ProcessStartInfo 参数的更复杂的那个。
      猜你喜欢
      • 2018-10-02
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多