我想要訪問清單詳細信息的清單文件與我的目錄結構中的模塊(psm1)文件一起存儲的自定義PowerShell模塊。如何使用c#讀取powershell清單文件(.psd1)
訪問清單詳細信息(如說明,GUID等)的最佳方式是什麼?
我想要訪問清單詳細信息的清單文件與我的目錄結構中的模塊(psm1)文件一起存儲的自定義PowerShell模塊。如何使用c#讀取powershell清單文件(.psd1)
訪問清單詳細信息(如說明,GUID等)的最佳方式是什麼?
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的複雜性,例如,在嘗試使用正則表達式時,錯誤地處理註釋或字符串會很容易。
添加對的引用。然後,使用以下代碼從.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"]);
}
請注意,如果您不信任輸入,則此方法非常危險 - Invoke-Expression可以愉快地運行psd1文件中的任何內容,例如它可能不是一個散列表(PowerShell不會加載該模塊,但此示例忽略該模塊)。 –
大多數行都是以key = value的形式出現的,所以只需讀取文件並過濾除了看起來像這樣的行外,也許用正則表達式然後加載所需的值。應該是這樣的。你有什麼特定的問題來完成你想要的嗎? –