winforms 在C#的powershell中使用Get-AppxPackage和Get-ItemProperty时,无法添加datatable

wvyml7n5  于 2023-10-23  发布在  C#
关注(0)|答案(1)|浏览(154)

我正在用C#开发WinForms应用程序。我正在尝试使用带有Get-AppxPackage和Get-ItemProperty的PowerShell检索安装在PC上的软件信息(名称、版本)。从Get-ItemProperty检索的信息在作为集合收集后正确存储在DataTable中,并显示在DataGridView中。但是,从Get-AppxPackage检索的Name和Version未收集到集合中,导致计数为0。当然,它们不会显示在DataTable或DataGridView中。
在这两种情况下,加载PowerShell的代码是相同的,我只更改了命令值。为什么不管用?
这里是附加的代码。

private DataTable GetPrograms_1()
{
DataTable programTable_1 = new DataTable();
programTable_1.Columns.Add("Item Name");
programTable_1.Columns.Add("Item Version");

        // Get-ItemProperty - UWP 
        string? command = "Get-ItemProperty HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* | Select-Object DisplayName, DisplayVersion";
        PowerShell powerShell = PowerShell.Create();
        powerShell.AddScript(command);

        // PowerShell
        Collection<PSObject> psObjects = powerShell.Invoke();

        //  DataTable
        foreach (PSObject psObject in psObjects)
        {
            if (psObject.Properties["DisplayName"] != null && psObject.Properties["DisplayVersion"] != null)
            {
                string itemName = psObject.Properties["DisplayName"]?.Value?.ToString();
                string itemVersion = psObject.Properties["DisplayVersion"]?.Value?.ToString();

                programTable_1.Rows.Add(itemName, itemVersion);
            }
        }
        return programTable_1;
    }

    // UWP data
    private DataTable GetPrograms_2()
    {
        DataTable programTable_2 = new DataTable();
        programTable_2.Columns.Add("App Name");
        programTable_2.Columns.Add("App Version");

        // Get-AppxPackage - UWP
        string? command = "Get-AppxPackage -AllUsers | Select-Object Name, Version";
        PowerShell powerShell = PowerShell.Create();
        powerShell.AddScript(command);

        // PowerShell 
        Collection<PSObject> psObjects = powerShell.Invoke();

        // DataTable
        foreach (PSObject psObject in psObjects)
        {
            if (psObject.Properties["Name"]?.Value != null && psObject.Properties["Version"]?.Value != null)
            {
                string appName = psObject.Properties["Name"]?.Value?.ToString();
                string appVersion = psObject.Properties["Version"]?.Value?.ToString();

                programTable_2.Rows.Add(appName, appVersion);
            }
        }
        return programTable_2;
    }

必须使用Get-AppxPackage。CurrentVersion/Uninstall下的注册表中的数据无法替换从Get-AppxPackage获取的数据。目的是提取有关PC上UWP应用程序的信息。要在Windows 11中从“设置”->“应用程序”->“应用程序和功能”中检索应用程序列表,必须使用Get-AppxPackage。

iszxjhcz

iszxjhcz1#

我采用的方法是直接通过powershell.exe执行PowerShell脚本,然后从标准输出中阅读结果。

// PowerShell Process Start
Process process = new Process();
process.StartInfo.FileName ="powershell.exe";
process.StartInfo.Arguments = $"-Command (Get-AppxPackage | Select-Object Name, Version)";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.Start();

// Read Result
string output = process.StandardOutput.ReadToEnd();

// Process End
process.WaitForExit();

相关问题