2013-04-03 158 views
-1

我在实际的命令提示符下输出看起来是这样的:命令行输出验证

Name: My Software 
Version: 1.0.1 
Installed location: c:\my folder 

我试图通过C#代码

System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c " + "my command to execute"); 

// The following commands are needed to redirect the standard output. 
// This means that it will be redirected to the Process.StandardOutput StreamReader. 
procStartInfo.RedirectStandardOutput = true; 
procStartInfo.UseShellExecute = false; 

// Do not create the black window. 
procStartInfo.CreateNoWindow = true; 

// Now we create a process, assign its ProcessStartInfo and start it 
System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
proc.StartInfo = procStartInfo; 
proc.Start(); 

// Get the output into a string 
string result = proc.StandardOutput.ReadToEnd(); 
string[] lines = result.Split(new string[] { System.Environment.NewLine, }, System.StringSplitOptions.None); 
foreach (string tmp in lines) 
{ 
    if (tmp.Contains("Version")) 
    { 
     isAvailable= true; 
    } 
} 

我不想得到这个输出只是检查一个版本标记,我试图获取版本值并进行比较,例如,如果值为1.0.1,我想要该值并与2.0.0进行比较。

我可以使用indexof(如result.IndexOf("Version:");) - 但是,这并不让我的版本

值的任何想法会有所帮助。

回答

1

尝试像下面......它会帮助你...

相反Contains检查这个词的使用IndexOf ...

if (tmp.IndexOf("Version") != -1) 
{ 
isAvailable = true; 
string[] info = tmp.Split(':'); 
string version = info[1].Trim(); 
Console.WriteLine(version); 
} 
+0

上面的代码给了我版本值,所有答案都很有帮助,谢谢大家。 – Sharpeye500

1

您可能需要使用正则表达式:

^Version:\s*(.*)$ 

应该匹配括号内的版本号。

1
string versionText; 
var stuff = tmp.Split(":"); 
if(stuff[0].Trim() == "Version") 
{ 
    isAvailable = true; 
    versionText = stuff[1].Trim(); 
} 

if(versionText == expectedVersionText) // Do something specfic. 
+1

您应该考虑使用' .Trim()去除空白。 – pascalhein

+0

@csharpler是的,这将是一个好主意。更新了答案。 –

2

您应该使用.NET Version class和它的CompareTo(Object) method做你的比较。

var input = new Regex(@"(?<=Version:)\s*(.*)").Matches(@"Name: My Software 
Version: 1.0.1 
Installed location: c:\my folder")[0].Value.Trim(); 

var a = new Version(input); 
var b = new Version("2.0.0"); 

int comparison = a.CompareTo(b); 

if(comparison > 0) 
{ 
    Console.WriteLine(a + " is a greater version."); 
} 
else if(comparison == 0) 
{ 
    Console.WriteLine(a + " and " + b +" are the same version."); 
} 
else 
{ 
    Console.WriteLine(b + " is a greater version."); 
} 
+0

1.0.1获得这个价值是我面临的挑战。 – Sharpeye500

+0

@ Sharpeye500我用稍微修改了csharpler在他们的回答中使用的正则表达式对它进行了更新 –

0
  string sought = "Version:"; 
      foreach (string tmp in lines) 
      { 
       if (tmp.Contains(sought)) 
       { 
        int position = tmp.IndexOf(sought) + sought.Length; 
        string version = tmp.Substring(tmp.IndexOf(sought) + sought.Length); 
        string[] versionParts = version.Split('.'); 
        VersionCompare(versionParts, new string[]{"2", "0", "0"}); 
       } 
      } 
/// <summary>Returns 0 if the two versions are equal, else a negative number if the first is smaller, or a positive value if the first is larder and the second is smaller.</summary> 
private int VersionCompare(string[] left, string[] right) 
{ 
    for(int i = 0; i < Math.Min(left.Length, right.Length); ++i) 
    { 
     int leftValue = int.Parse(left[i]), rightValue = int.Parse(right[i]); 
     if(leftValue != rightValue) return leftValue - rightValue; 
    } 
    return left.Length - right.Length; 
}