我想要访问清单详细信息的清单文件与我的目录结构中的模块(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的形式出现的,所以只需读取文件并过滤除了看起来像这样的行外,也许用正则表达式然后加载所需的值。应该是这样的。你有什么特定的问题来完成你想要的吗? –