从C#运行复杂的命令行

时间:2014-05-24 13:33:47

标签: c# process.start

我试图从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替换为文本框的内容

有人能帮助我吗?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

<小时/> 通常,如果您坚持使用单个参数调用,则应将可执行文件括在双引号中,如下所示:

"\"C:\\Program Files\\GoToTags\\GoToTags Encoder\\GoToTags.Encoder.exe\" ...arguments here..."

但是,此表单Process.Start(string)无效,因为它明确禁止它。

答案 2 :(得分:0)

你有几个等待你的陷阱。

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

其次,对\t的单参数调用只接受一个命令 - 它不能接受命令参数 - 所以你必须调用双参数重载。

第三,Process.Start参数值的引号需要处理,以便C#语法知道你想要什么 - 即将它们传递给命令。我已将命令参数分成两部分以使其更清晰。我选择使用反斜杠来逃避它们,尽管使用替代records也同样好,并且选择主要取决于个人偏好,除非上下文强烈指向一种方式而不是另一种方式。

@"...""..."

[编辑添加:]

如果由于某种原因你发现你想要或需要使用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,那么第四个问题就在你身边等待{{1}查找大括号(cmdArgsstring.Format)字符来分隔插入参数规范,但是{命令行参数需要字符串中的大括号字符。实现这一目标的方法是将所需的大括号加倍,如下所示:

}