5

我正在寻找PowerShell 中实现 PowerShell 提供程序。

我一直在想,如果我只是定义类型,然后将它们导入我的会话(导入模块),我应该能够让它们可用。

例如,这不起作用,但它沿着我想要实现的路径。

我显然错过了很多......有人知道这是否可能吗?

# 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

导入模块后,我尝试创建驱动器“环境”:

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]
4

2 回答 2

6

我强烈建议你看看 Oisin 写的东西,怀疑像你这样的人,他们可以抓住它,这可能是非常好的参考。或者也许应该避免什么?;) 您可以在 codeplex 上找到它:http: //psprovider.codeplex.com/

于 2012-05-22T21:03:51.973 回答
2

我知道你问这个问题已经有一段时间了,但我自己一直在寻找同样的答案。碰巧的是,重新阅读 msdn 中的 Samples 最终让我得到了答案,并且考虑到我认为我会分享的挫败商数:

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

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

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

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

将 where 过滤器中的 Provider 名称替换为您自己的名称。

干杯,弗雷德

于 2014-06-25T14:36:48.900 回答