5

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

import-moduleの後、ドライブの「環境」を作成しようとします。

new-psdrive -psprovider Environments -name "Environments" -root ""

エラー:

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

プロバイダーが実際に機能していると仮定すると、開発、qa、ステージング、本番などの環境のリストを返すようにすることができます。

次に、これを次の方法で再利用できるようにしたいと思います。

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でサンプルを読み直すと、ついに私の答えが得られ、私が共有したいと思った欲求不満の商を考えると、次のようになります。

プロバイダーを含むアセンブリは、(add-type宣言を含むモジュールだけでなく)Import-Moduleを使用してインポートする必要があります。これは、次の2つの方法で実行できます。

オプション1:ランタイムアセンブリを.dllファイルとしてビルドするAdd-Typeのパラメーターを使用し、ファイルをインポートします。

オプション2:ランタイムアセンブリをメモリからインポートします。これは私が標準のmsdnサンプルでそれをした方法です:

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

whereフィルターのプロバイダー名を独自のプロバイダー名に置き換えます。

乾杯、フレッド

于 2014-06-25T14:36:48.900 に答える