2016-12-27 62 views
4

我正在获取启动应用程序的列表,并且希望仅获取在启动时运行的应用程序的路径。启动应用程序的列表还包含传递给应用程序的参数,这些参数的格式不同;实例是从字符串中查找文件的路径

C:\程序文件(x86)\互联网下载管理\ IDMan.exe/ONBOOT

“C:\ Program Files文件\过程哈克2 \ ProcessHacker.exe” -hide

“C:\ Program Files \ CCleaner \ CCleaner64.exe”/ MONITOR

“C:\ Program Files(x86)\ Google \ Chrome \ Application \ chrome.exe”--no-startup-window/prefetch: 5

“C:\ Program Files(x86)\ GlassWire \ glasswire.exe “-hide

C:\ Program Files文件\ IDT \ WDM \ sttray64.exe

我想使用正则表达式如下

Regex.Matches(input, "([a-zA-Z]*:[\\[a-zA-Z0-9 .]*]*)"); 

请指导我怎么可以只提取应用程序路径忽略所有参数和其他启动命令。

+0

为什么不使用字符串操作?例如,用“/”分隔,先取出然后再用“ - ”分开,然后取第一个...所有参数都有标记。 – Emad

+0

@Emad有可能会遗漏一些拆分器,这可能会导致问题 – WiXXeY

+0

由于在Windows中大多数或所有的可执行文件都具有“.exe”扩展名,因此您可以尝试查找“.exe”(.exe和一个额外的空格)以及然后提取离开参数的路径。 – sameerkn

回答

2

试试这个简单的方法:

string cmd = "\"C:\\Program Files (x86)\\GlassWire\\glasswire.exe\" -hide"; 

int index = cmd.ToLower().LastIndexOf(".exe"); 
string path = cmd.Substring(0, index+4); 
index = path.IndexOf("\""); 
if (index >= 0) 
path = path.Substring(index + 1); 
+0

“\”C:\\ Program Files(x86)\\ GlassWire \\ glasswire.exe \“ -hide.exe“;'? – sameerkn

+0

在这种情况下'IndexOf(“。exe”)'可以用来代替'LastIndexOf(“。exe”)' –

+0

我的意思是这不是一个通用的解决方案,因为路径中的一个目录可能像“C: \ Internet.executable \ setup中。那么'IndexOf'也将不起作用。 – sameerkn

2

由于预期的输入列表将包含可执行文件列表,所有的扩展名都是.exe,我们可以在这里使用该扩展名通过控制String类的.Substring()方法。样品的使用将是这样的:

List<string> inputMessageStr = PopulateList(); // method that returns list of strings 
List<string> listofExePaths= inputMessageStr.Select(x=> x.Substring(0, x.IndexOf(".exe") + 4)).ToList(); 
+2

虽然不太可能,但可能会有一些扩展名为非.exe的可执行文件,例如“.com”。此外,Windows允许执行其他文件类型由Windows打开。我认为这是一个好主意,但不是一个强大的通用解决方案。 – Emad

+1

@Emad:感谢您的宝贵点,让我检查一些强大的通用解决方案,并更新答案 –

1

有很多情况下它可以打破找到完整的可执行文件的路径形成一个给定的字符串的正常方法。 只发现".exe"在一般情况下不起作用。至少有一个空格将实际完整的可执行文件路径与参数分开。

注意:此解决方案基于可执行文件将存在于其预期路径上的假设。因为OP在启动时运行的应用程序路径列表中存在这个假设。

public string GetPathOnly(string strSource) 
{ 
    //removing all the '"' double quote characters 
    strSource.Trim(new Char[] {'"'}); 

    int i; 
    string strExecutablePath = ""; 
    for(i = 0; i < strSource.Length; ++i) 
    { 
     if(strSource[i] == ' ') 
     { 
      if(File.Exists(strExecutablePath)) 
      { 
       return strExecutablePath; 
      }    
     } 
     strExecutablePath.Insert(strExecutablePath.Length, strSource[i]); 
    } 

    if(File.Exists(strExecutablePath)) 
    { 
     return strExecutablePath; 
    } 

    return ""; // no actual executable path found. 
}