2014-05-19 43 views
6

我想要訪問清單詳細信息的清單文件與我的目錄結構中的模塊(psm1)文件一起存儲的自定義PowerShell模塊。如何使用c#讀取powershell清單文件(.psd1)

訪問清單詳細信息(如說明,GUID等)的最佳方式是什麼?

+0

大多數行都是以key = value的形式出現的,所以只需讀取文件並過濾除了看起來像這樣的行外,也許用正則表達式然後加載所需的值。應該是這樣的。你有什麼特定的問題來完成你想要的嗎? –

回答

6

psd1文件是一個有效的PowerShell腳本,所以最好讓PowerShell解析文件。

最簡單的方法是使用Test-ModuleManifest cmdlet。從C#開始,這看起來像這樣:

using (var ps = PowerShell.Create()) 
{ 
    ps.AddCommand("Test-ModuleManifest").AddParameter("Path", manifestPath); 
    var result = ps.Invoke(); 
    PSModuleInfo moduleInfo = result[0].BaseObject as PSModuleInfo; 

    // now you can look at the properties like Guid or Description 
} 

其他方法無法處理解析PowerShell的複雜性,例如,在嘗試使用正則表達式時,錯誤地處理註釋或字符串會很容易。

0

添加對​​的引用。然後,使用以下代碼從.psd1文件獲取Hashtable

static void Main(string[] args) 
{ 
    PowerShell ps = PowerShell.Create(); 
    string psd = "C:\\Users\\Trevor\\Documents\\WindowsPowerShell\\Modules\\ISESteroids\\ISESteroids.psd1"; 
    ps.AddScript(String.Format("Invoke-Expression -Command (Get-Content -Path \"{0}\" -Raw)", psd)); 
    var result = ps.Invoke(); 
    Debug.WriteLine(((Hashtable)result[0].ImmediateBaseObject)["Description"]); 
} 
+3

請注意,如果您不信任輸入,則此方法非常危險 - Invoke-Expression可以愉快地運行psd1文件中的任何內容,例如它可能不是一個散列表(PowerShell不會加載該模塊,但此示例忽略該模塊)。 –

相關問題