【问题标题】:Converting Shell.Application from PowerShell从 PowerShell 转换 Shell.Application
【发布时间】:2014-04-27 18:27:43
【问题描述】:

目前我有一个 PowerShell 脚本,它能够使用 Shell.Application COMobject 在我的控制面板中获取程序列表。我需要将其转换为 C#,但我似乎无法正确处理。关于我做错了什么有什么建议吗?

下面显示的 C# 代码不会返回任何错误消息。它只是运行(因为它是空的)。当我从 C# 示例中删除 if 语句时,我得到“对象引用未设置为对象的实例。”。我知道我的文件夹变量为空,但我不明白为什么?

向我的项目添加了 Shell32.Dll(C:\Windows\System32\shell32.dll) 引用。 添加了 Shell32 Using 指令

(工作)PowerShell代码

$Shell = New-Object -ComObject Shell.Application
$folderName = "::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\" +
 "::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}");

$folder = $Shell.NameSpace($folderName)

if($folder)
{
    $folder.Items() 
}

(不工作)C#代码

        Type t = Type.GetTypeFromProgID("Shell.Application");
        Shell s = (Shell)Activator.CreateInstance(t);
        var objNameSpace = s.NameSpace(@"::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}");

        if (objNameSpace != null)
        {
            MessageBox.Show(objNameSpace.Items().Count.ToString());
        }

(更多不工作)C# 代码。第二种方法

        Shell32.Shell shell = new Shell32.Shell();
        Shell32.Shell objShell = shell.Application;
        var objShellFolder = objShell.NameSpace(@"::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}");

        if(objShellFolder != null)
        {
            MessageBox.Show(objShellFolder.Items().ToString());
        }

【问题讨论】:

  • 你能澄清一下“不工作”是什么意思吗?您在 both C# 示例中遇到什么错误?
  • @TrevorSullivan 这会有所帮助,不是吗?我每次都得到一个空引用。 “你调用的对象是空的。”这仅在我删除 if 语句时发生。使用 If 语句,它什么都不做。 - 将编辑帖子以反映此评论。
  • 你为什么要这样做?查询 `HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall` 会给你 99% 的应用程序,不是吗?而且使用起来更容易
  • @FrodeF 是的,它会给我每个写入注册表的程序。主要问题是一个算法,它将整理所有那些只能向我展示我控制面板中的内容的垃圾。没有我可以过滤掉的独特属性可以做到这一点。

标签: c# winforms powershell com


【解决方案1】:

对于代码的Shell32 Interop 版本,您需要使用"shell:::{7b81be6a-ce2b-4676-a29e-eb907a5126c5}" 作为命名空间。

参考:https://stackoverflow.com/a/48129483/722393

【讨论】:

    猜你喜欢
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多