【问题标题】:How to read powershell manifest file (.psd1) using c#如何使用 c# 读取 powershell 清单文件(.psd1)
【发布时间】:2014-05-20 12:36:27
【问题描述】:

我正在尝试访问自定义 PowerShell 模块的清单详细信息,该模块将清单文件与模块 (psm1) 文件一起存储在我的目录结构中。

访问描述、GUID 等清单详细信息的最佳方式是什么?

【问题讨论】:

  • 大多数行都是 key = value 的形式,所以只需读取文件并过滤掉除看起来像这样的行之外的所有内容,可能使用正则表达式,然后加载您需要的值。应该是这样的。你在完成你想要的事情方面有什么具体问题吗?

标签: c# powershell


【解决方案1】:

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 的复杂性,例如尝试使用正则表达式时,很容易错误地处理 cmets 或此处的字符串。

【讨论】:

    【解决方案2】:

    添加对System.Management.Automation 的引用。然后,使用以下代码从.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 不会加载模块,但此示例忽略了它。)
    猜你喜欢
    • 2014-10-14
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2010-12-21
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多