在PowerShell中实现PowerShell PSProvider

6
我希望能在PowerShell中实现一个PowerShell提供程序。
我一直认为,如果我定义了类型,然后将它们导入到我的会话中(import-module),我就可以使它们可用。
例如,这个方法并不起作用,但它沿着我想要实现的道路。
显然,我还缺少很多东西……有人知道这是否可能吗?
# EnvironmentProvider.ps1
    $reference_assemblies = (

      "System.Management.Automation, Version=1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
    #  "System.Configuration.Install, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    )

    $source = @"

    namespace Providers
    {

    using System.Management.Automation;
    using System.Management.Automation.Provider;


        [CmdletProvider("Environments", ProviderCapabilities.None)]
        public class EnvironmentProvider : DriveCmdletProvider
        {
            protected override PSDriveInfo NewDrive(PSDriveInfo drive)
            {
                return new EnvironmentDriveInfo(drive);
            }

            protected override object NewDriveDynamicParameters()
            {
                return base.NewDriveDynamicParameters();
            }

        }

         public class EnvironmentDriveInfo : PSDriveInfo
        {
            public EnvironmentDriveInfo(PSDriveInfo driveInfo) : base(driveInfo)
            {
            }
        }


    }
    "@

    # -ea silentlycontinue in case its already loaded
    #
    add-type -referencedassemblies $referenced_assemblies -typedefinition $source -language CSharp -erroraction silentlycontinue

在导入模块后,我尝试创建名为“environments”的驱动器:
new-psdrive -psprovider Environments -name "Environments" -root ""

错误信息:

New-PSDrive : Cannot find a provider with the name 'Environments'.

假设提供者确实起作用,可以让它返回一个环境列表:dev, qa, staging, production。
然后我希望能够通过以下方式重复使用此功能:
c:\adminlib>import-module .\EnvironmentProvider.ps1
c:\adminlib>environments:

environments:>ls
dev
qa
staging
production

environments:> cd production
environments\production> [execute actions against production]

environments\production:> cd dev
environments\dev:> [execute actions against dev, etc]
2个回答

6
我强烈建议您查看Oisin编写的内容,我怀疑对于像您这样能够理解它的人来说,这可能是一个非常好的参考,可以让您知道如何做。或者也许要避免什么?;) 您可以在codeplex上找到它:http://psprovider.codeplex.com/

虽然不是完全使用PowerShell实现的,但看起来这将是完美的,谢谢! - Zach Bonham

2

我知道你提出这个问题已经有一段时间了,但我自己也一直在寻找同样的答案。恰好,重新阅读msdn中的示例最终给了我答案,并且考虑到挫败感,我想分享一下:

包含提供程序的程序集需要使用Import-Module导入(不仅仅是包含Add-Type声明的模块)。这可以通过两种方式来完成:

选项1: 使用Add-Type的参数构建运行时程序集作为.dll文件并导入该文件。

选项2: 从内存中导入运行时程序集。这是我使用标准的msdn示例所做的方式:

[appdomain]::CurrentDomain.GetAssemblies() | Where {$_.ExportedTypes -ne $null} | Where {($_.ExportedTypes | Select -ExpandProperty "Name") -contains "AccessDBProvider"} | Import-Module

请将where过滤器中的提供者名称替换为您自己的名称。
祝好, Fred

嘿,弗雷德 - 距你发布那篇更新已经过去了3年,但它对我帮助非常大。我很久以前就看到了那些自定义的Access提供程序页面,并记住了它们,今天我找它们时发现微软网站上已经没有源代码了 - 但是你的参考起到了作用。非常感谢! - DanW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接