【问题标题】:Run commandline from c# with parameters?从带有参数的c#运行命令行?
【发布时间】:2011-08-23 06:37:15
【问题描述】:

可以使用类似这样的东西在 c# 中运行命令行:

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

问题是命令字符串是否包含参数,例如:

C:\My Dir\MyFile.exe MyParam1 MyParam2

这不起作用,我看不到如何从该字符串中提取参数并将其设置在process.Arguments 属性上?路径和文件名可以是别的东西,文件不必以exe结尾。

我该如何解决这个问题?

【问题讨论】:

  • 所以,问题是,如何将命令行拆分为FileNameArguments
  • 听起来你想要一个正则表达式来找到断点。严格来说,如果文件名中包含空格,则应该用双引号括起来。那会对你有很大帮助。是这种情况吗,在您的示例中是文件名C:\\MyC:\\My Dir\MyFile.exe?顺便说一句,M 是否逃过一劫?
  • 文件是否以点和任何扩展名结尾?例如.com、.exe...

标签: c# .net process


【解决方案1】:

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

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(); 

如果你有一个完整的字符串需要解析,我会使用这里其他人提出的其他方法。如果你想给进程添加参数,使用上面的。

【讨论】:

  • 我该如何取回结果?
【解决方案2】:

这可能是最糟糕的解决方案,但它可能是一个更安全的解决方案:

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 横向思考。如果确实没有引号,也可以使用。
【解决方案3】:

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

在 Windows 中肯定是这种情况。否则,规则会变得更加符合上下文。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多