2016-12-27 64 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. 
}