从PowerShell转换Shell.Application

时间:2014-03-20 17:38:04

标签: c# winforms powershell com

目前我有一个PowerShell脚本,可以使用Shell.Application COMobject来获取我的控制面板中的程序列表。我需要将其转换为C#,但我似乎无法做到这一点。关于我做错了什么的任何建议?

下面显示的C#代码不会重新计算任何错误消息。它只是贯穿(因为它是空的)。当我从C#示例中删除if语句时,我得到"对象引用未设置为对象的实例。"。我知道我的文件夹变量是null但我不知道为什么?

在我的项目中添加了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());
        }

1 个答案:

答案 0 :(得分:0)

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

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