用C#带参数运行命令行?

10

可以通过使用类似以下代码来在C#中运行命令行:

process = new Process();
process.StartInfo.FileName = command;
process.Start();

问题在于如果命令字符串包含参数,例如:

C:\My Dir\MyFile.exe MyParam1 MyParam2

这种方法行不通,我也不知道如何从这个字符串中提取参数并将其设置到process.Arguments属性上。路径和文件名可能是其他内容,文件的扩展名不一定是 exe

我应该怎么解决?


那么问题是,我怎样才能将命令行分割成“文件名”和“参数”? - Jodrell
听起来你想要一个正则表达式来查找断点。严格来说,如果文件名包含空格,则应该用双引号括起来。这会对你有很大帮助。在你的例子中,文件名是C:\\My还是C:\\My Dir\MyFile.exe?顺便问一下,那个M被转义了吗? - Jodrell
文件是否以点和任何扩展名结尾?例如:.com,.exe... - ibram
3个回答

7

如果我理解正确,我会使用:

string command = @"C:\My Dir\MyFile.exe";
string args = "MyParam1 MyParam2";

Process process = new Process(); 
process.StartInfo.FileName = command; 
process.StartInfo.Arguments = args;
process.Start(); 

如果你有一个完整的字符串需要解析,我会使用其他人提出的方法。如果你想向过程中添加参数,请使用上述方法。


我该如何获取结果返回? - Eduardo Pignatelli

5
这可能是最差的解决方案,但它可能更安全:
string cmd = "C:\\My Dir\\MyFile.exe MyParam1 MyParam2";
System.IO.FileInfo fi = null;
StringBuilder file = new StringBuilder();
// look up until you find an existing file
foreach ( char c in cmd )
{
    file.Append( c );
    fi = new System.IO.FileInfo( file.ToString() );
    if ( fi.Exists ) break;
}

cmd = cmd.Remove( 0, file.Length );
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo( fi.Name, cmd );
System.Diagnostics.Process.Start( psi );

这是一个相当不错的想法,它利用环境的上下文来推断字符串的正确性。对于侧面思考加1分。如果确实没有引号,它也可以工作。 - Jodrell

3

断言:如果文件名包含空格,必须用双引号括起来。

在Windows中肯定是这样的。否则规则就变得更加上下文相关。

可以看一下regex-matching-spaces-but-not-in-strings,我猜你可以使用正则表达式,

" +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"

使用Regex.Split()将您的命令行转换为数组。第一部分应该是您的文件名。


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