Tworzenie dostawcy kontenerów programu Windows PowerShellCreating a Windows PowerShell Container Provider

W tym temacie opisano sposób tworzenia dostawcy środowiska Windows PowerShell, który może współdziałać z wielowarstwowymi magazynami danych.This topic describes how to create a Windows PowerShell provider that can work on multi-layer data stores. W przypadku tego typu magazynu danych najwyższy poziom magazynu zawiera elementy główne, a każdy kolejny poziom jest określany jako węzeł elementów podrzędnych.For this type of data store, the top level of the store contains the root items and each subsequent level is referred to as a node of child items. Dzięki umożliwieniu użytkownikowi pracy nad tymi węzłami podrzędnymi użytkownik może korzystać z hierarchicznie przy użyciu magazynu danych.By allowing the user to work on these child nodes, a user can interact hierarchically through the data store.

Dostawcy, którzy mogą korzystać z magazynów danych na wiele poziomów, są nazywani dostawcami kontenerów środowiska Windows PowerShell.Providers that can work on multi-level data stores are referred to as Windows PowerShell container providers. Należy jednak pamiętać, że dostawca kontenera programu Windows PowerShell może być używany tylko wtedy, gdy istnieje jeden kontener (bez zagnieżdżonych kontenerów) z elementami w nim.However, be aware that a Windows PowerShell container provider can be used only when there is one container (no nested containers) with items in it. W przypadku kontenerów zagnieżdżonych należy zaimplementować dostawcę nawigacji programu Windows PowerShell.If there are nested containers, then you must implement a Windows PowerShell navigation provider. Aby uzyskać więcej informacji na temat implementowania dostawcy nawigacji programu Windows PowerShell, zobacz Tworzenie dostawcy nawigacji programu Windows PowerShell.For more information about implementing Windows PowerShell navigation provider, see Creating a Windows PowerShell Navigation Provider.

Uwaga

Plik źródłowy C# (AccessDBSampleProvider04.cs) dla tego dostawcy można pobrać przy użyciu zestawu Microsoft Windows Software Development Kit dla systemów Windows Vista i .NET Framework 3,0.You can download the C# source file (AccessDBSampleProvider04.cs) for this provider using the Microsoft Windows Software Development Kit for Windows Vista and .NET Framework 3.0 Runtime Components. Aby uzyskać instrukcje dotyczące pobierania, zobacz jak zainstalować program Windows PowerShell i pobrać zestaw SDK programu Windows PowerShell.For download instructions, see How to Install Windows PowerShell and Download the Windows PowerShell SDK. Pobrane pliki źródłowe są dostępne w <PowerShell Samples> katalogu.The downloaded source files are available in the <PowerShell Samples> directory. Aby uzyskać więcej informacji na temat innych implementacji dostawcy środowiska Windows PowerShell, zobacz projektowanie dostawcy środowiska Windows PowerShell.For more information about other Windows PowerShell provider implementations, see Designing Your Windows PowerShell Provider.

Opisany tutaj dostawca kontenera programu Windows PowerShell definiuje bazę danych jako jeden kontener, z tabelami i wierszami bazy danych zdefiniowanymi jako elementy kontenera.The Windows PowerShell container provider described here defines the database as its single container, with the tables and rows of the database defined as items of the container.

Przestroga

Należy pamiętać, że w tym projekcie założono, że baza danych ma pole o IDENTYFIKATORze nazwy, a typ pola to LongInteger.Be aware that this design assumes a database that has a field with the name ID, and that the type of the field is LongInteger.

Definiowanie klasy dostawcy kontenera programu Windows PowerShellDefining a Windows PowerShell Container Provider Class

Dostawca kontenera programu Windows PowerShell musi definiować klasę .NET, która pochodzi z klasy podstawowej System. Management. Automation. Provider. Containercmdletprovider .A Windows PowerShell container provider must define a .NET class that derives from the System.Management.Automation.Provider.Containercmdletprovider base class. Poniżej znajduje się definicja klasy dostawcy kontenera programu Windows PowerShell opisana w tej sekcji.Here is the class definition for the Windows PowerShell container provider described in this section.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider

Należy zauważyć, że w tej definicji klasy atrybut System. Management. Automation. Provider. Cmdletproviderattribute zawiera dwa parametry.Notice that in this class definition, the System.Management.Automation.Provider.Cmdletproviderattribute attribute includes two parameters. Pierwszy parametr określa przyjazną dla użytkownika nazwę dostawcy, który jest używany przez program Windows PowerShell.The first parameter specifies a user-friendly name for the provider that is used by Windows PowerShell. Drugi parametr określa funkcje programu Windows PowerShell, które dostawca uwidacznia środowisko uruchomieniowe środowiska Windows PowerShell podczas przetwarzania polecenia.The second parameter specifies the Windows PowerShell specific capabilities that the provider exposes to the Windows PowerShell runtime during command processing. Dla tego dostawcy nie są dodawane żadne określone możliwości programu Windows PowerShell.For this provider, there are no Windows PowerShell specific capabilities that are added.

Definiowanie podstawowej funkcjonalnościDefining Base Functionality

Zgodnie z opisem w temacie projektowanie dostawcy środowiska Windows PowerShell, Klasa System. Management. Automation. Provider. Containercmdletprovider pochodzi z kilku innych klas, które udostępniają różne funkcje dostawcy.As described in Designing Your Windows PowerShell Provider, the System.Management.Automation.Provider.Containercmdletprovider class derives from several other classes that provided different provider functionality. W związku z tym dostawca kontenera programu Windows PowerShell musi definiować wszystkie funkcje udostępniane przez te klasy.A Windows PowerShell container provider, therefore, needs to define all of the functionality provided by those classes.

Aby zaimplementować funkcje dodawania informacji o inicjacji specyficznych dla sesji i zwalniania zasobów używanych przez dostawcę, zobacz Tworzenie podstawowego dostawcy środowiska Windows PowerShell.To implement functionality for adding session-specific initialization information and for releasing resources that are used by the provider, see Creating a Basic Windows PowerShell Provider. Jednak większość dostawców (łącznie z opisanym tu dostawcą) może korzystać z domyślnej implementacji tej funkcji dostępnej w programie Windows PowerShell.However, most providers (including the provider described here) can use the default implementation of this functionality that is provided by Windows PowerShell.

Aby uzyskać dostęp do magazynu danych, dostawca musi zaimplementować metody klasy bazowej System. Management. Automation. Provider. Drivecmdletprovider .To get access to the data store, the provider must implement the methods of the System.Management.Automation.Provider.Drivecmdletprovider base class. Aby uzyskać więcej informacji na temat implementowania tych metod, zobacz Tworzenie dostawcy dysku programu Windows PowerShell.For more information about implementing these methods, see Creating an Windows PowerShell Drive Provider.

Aby manipulować elementami magazynu danych, takimi jak pobieranie, ustawianie i czyszczenie elementów, dostawca musi zaimplementować metody dostarczone przez klasę bazową System. Management. Automation. Provider. Itemcmdletprovider .To manipulate the items of a data store, such as getting, setting, and clearing items, the provider must implement the methods provided by the System.Management.Automation.Provider.Itemcmdletprovider base class. Aby uzyskać więcej informacji na temat implementowania tych metod, zobacz Tworzenie dostawcy elementów programu Windows PowerShell.For more information about implementing these methods, see Creating an Windows PowerShell Item Provider.

Pobieranie elementów podrzędnychRetrieving Child Items

Aby można było pobrać element podrzędny, dostawca kontenera programu Windows PowerShell musi zastąpić metodę System. Management. Automation. Provider. Containercmdletprovider. Getchilditems * , aby obsługiwać wywołania z Get-ChildItem polecenia cmdlet.To retrieve a child item, the Windows PowerShell container provider must override the System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* method to support calls from the Get-ChildItem cmdlet. Ta metoda pobiera elementy podrzędne z magazynu danych i zapisuje je w potoku jako obiekty.This method retrieves child items from the data store and writes them to the pipeline as objects. Jeśli recurse parametr polecenia cmdlet jest określony, Metoda pobiera wszystkie elementy podrzędne niezależnie od poziomu, w którym się znajdują.If the recurse parameter of the cmdlet is specified, the method retrieves all children regardless of what level they are at. Jeśli recurse parametr nie jest określony, Metoda pobiera tylko jeden poziom elementów podrzędnych.If the recurse parameter is not specified, the method retrieves only a single level of children.

Poniżej przedstawiono implementację metody System. Management. Automation. Provider. Containercmdletprovider. Getchilditems * dla tego dostawcy.Here is the implementation of the System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* method for this provider. Należy zauważyć, że ta metoda pobiera elementy podrzędne we wszystkich tabelach bazy danych, gdy ścieżka wskazuje bazę danych programu Access i Pobiera elementy podrzędne z wierszy tej tabeli, jeśli ścieżka wskazuje tabelę danych.Notice that this method retrieves the child items in all database tables when the path indicates the Access database, and retrieves the child items from the rows of that table if the path indicates a data table.

protected override void GetChildItems(string path, bool recurse)
{
    // If path represented is a drive then the children in the path are
    // tables. Hence all tables in the drive represented will have to be
    // returned
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table, path, true);

            // if the specified item exists and recurse has been set then
            // all child items within it have to be obtained as well
            if (ItemExists(path) && recurse)
            {
                GetChildItems(path + pathSeparator + table.Name, recurse);
            }
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get the table name, row number and type of path from the
        // path specified
        string tableName;
        int rowNumber;

        PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

        if (type == PathType.Table)
        {
            // Obtain all the rows within the table
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);
            WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
        }
        else
        {
            // In this case, the path specified is not valid
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildItems
protected override void GetChildItems(string path, bool recurse)
{
    // If path represented is a drive then the children in the path are 
    // tables. Hence all tables in the drive represented will have to be
    // returned
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table, path, true);

            // if the specified item exists and recurse has been set then 
            // all child items within it have to be obtained as well
            if (ItemExists(path) && recurse)
            {
                GetChildItems(path + pathSeparator + table.Name, recurse);
            }
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get the table name, row number and type of path from the
        // path specified
        string tableName;
        int rowNumber;

        PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

        if (type == PathType.Table)
        {
            // Obtain all the rows within the table
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);
            WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
        }
        else
        {
            // In this case, the path specified is not valid
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildItems

Zapamiętaj o implementacji GetChildItemsThings to Remember About Implementing GetChildItems

Poniższe warunki mogą dotyczyć implementacji elementu System. Management. Automation. Provider. Containercmdletprovider. Getchilditems *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:

Dołączanie parametrów dynamicznych do polecenia cmdlet Get-ChildItemAttaching Dynamic Parameters to the Get-ChildItem Cmdlet

Czasami Get-ChildItem polecenie cmdlet wywołujące System. Management. Automation. Provider. Containercmdletprovider. Getchilditems * wymaga dodatkowych parametrów, które są określone dynamicznie w czasie wykonywania.Sometimes the Get-ChildItem cmdlet that calls System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* requires additional parameters that are specified dynamically at runtime. Aby zapewnić te parametry dynamiczne, dostawca kontenera programu Windows PowerShell musi zaimplementować metodę System. Management. Automation. Provider. Containercmdletprovider. Getchilditemsdynamicparameters * .To provide these dynamic parameters, the Windows PowerShell container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Getchilditemsdynamicparameters* method. Ta metoda pobiera parametry dynamiczne dla elementu w wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola, które mają atrybuty analizy podobne do klasy poleceń cmdlet lub obiektu System. Management. Automation. Runtimedefinedparameterdictionary .This method retrieves dynamic parameters for the item at the indicated path and returns an object that has properties and fields with parsing attributes similar to a cmdlet class or a System.Management.Automation.Runtimedefinedparameterdictionary object. Środowisko uruchomieniowe programu Windows PowerShell używa zwróconego obiektu do dodawania parametrów do Get-ChildItem polecenia cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Get-ChildItem cmdlet.

Ten dostawca kontenera programu Windows PowerShell nie implementuje tej metody.This Windows PowerShell container provider does not implement this method. Jednak następujący kod jest domyślną implementacją tej metody.However, the following code is the default implementation of this method.

Pobieranie nazw elementów podrzędnychRetrieving Child Item Names

Aby można było pobrać nazwy elementów podrzędnych, dostawca kontenera programu Windows PowerShell musi zastąpić metodę System. Management. Automation. Provider. Containercmdletprovider. Getchildnames * , aby obsługiwać wywołania z Get-ChildItem polecenia cmdlet, gdy Name parametr jest określony.To retrieve the names of child items, the Windows PowerShell container provider must override the System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* method to support calls from the Get-ChildItem cmdlet when its Name parameter is specified. Ta metoda pobiera nazwy elementów podrzędnych dla określonej ścieżki lub nazw elementów podrzędnych dla wszystkich kontenerów, jeśli returnAllContainers określono parametr polecenia cmdlet.This method retrieves the names of the child items for the specified path or child item names for all containers if the returnAllContainers parameter of the cmdlet is specified. Nazwa elementu podrzędnego to część liścia ścieżki.A child name is the leaf portion of a path. Na przykład nazwa elementu podrzędnego ścieżki c:\windows\system32\abc.dll to "abc.dll".For example, the child name for the path c:\windows\system32\abc.dll is "abc.dll". Nazwa elementu podrzędnego katalogu c:\Windows\System32 to "system32".The child name for the directory c:\windows\system32 is "system32".

Poniżej przedstawiono implementację metody System. Management. Automation. Provider. Containercmdletprovider. Getchildnames * dla tego dostawcy.Here is the implementation of the System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* method for this provider. Należy zauważyć, że metoda pobiera nazwy tabel, jeśli określona ścieżka wskazuje bazę danych programu Access (dysk) i numery wierszy, jeśli ścieżka wskazuje tabelę.Notice that the method retrieves table names if the specified path indicates the Access database (drive) and row numbers if the path indicates a table.

protected override void GetChildNames(string path,
                            ReturnContainers returnContainers)
{
    // If the path represented is a drive, then the child items are
    // tables. get the names of all the tables in the drive.
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table.Name, path, true);
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get type, table name and row number from path specified
        string tableName;
        int rowNumber;

        PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

        if (type == PathType.Table)
        {
            // Get all the rows in the table and then write out the
            // row numbers.
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row.RowNumber, path, false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);

            WriteItemObject(row.RowNumber, path, false);
        }
        else
        {
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildNames
protected override void GetChildNames(string path,
                              ReturnContainers returnContainers)
{
    // If the path represented is a drive, then the child items are
    // tables. get the names of all the tables in the drive.
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table.Name, path, true);
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get type, table name and row number from path specified
        string tableName;
        int rowNumber;

        PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

        if (type == PathType.Table)
        {
            // Get all the rows in the table and then write out the 
            // row numbers.
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row.RowNumber, path, false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);

            WriteItemObject(row.RowNumber, path, false);
        }
        else
        {
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildNames

Zapamiętaj o implementacji GetChildNamesThings to Remember About Implementing GetChildNames

Poniższe warunki mogą dotyczyć implementacji elementu System. Management. Automation. Provider. Containercmdletprovider. Getchilditems *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:

Dołączanie parametrów dynamicznych do polecenia cmdlet Get-ChildItem (nazwa)Attaching Dynamic Parameters to the Get-ChildItem Cmdlet (Name)

Czasami Get-ChildItem polecenie cmdlet (z Name parametrem) wymaga dodatkowych parametrów, które są określone dynamicznie w czasie wykonywania.Sometimes the Get-ChildItem cmdlet (with the Name parameter) requires additional parameters that are specified dynamically at runtime. Aby zapewnić te parametry dynamiczne, dostawca kontenera programu Windows PowerShell musi zaimplementować metodę System. Management. Automation. Provider. Containercmdletprovider. Getchildnamesdynamicparameters * .To provide these dynamic parameters, the Windows PowerShell container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Getchildnamesdynamicparameters* method. Ta metoda pobiera parametry dynamiczne dla elementu w wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola, które mają atrybuty analizy podobne do klasy poleceń cmdlet lub obiektu System. Management. Automation. Runtimedefinedparameterdictionary .This method retrieves the dynamic parameters for the item at the indicated path and returns an object that has properties and fields with parsing attributes similar to a cmdlet class or a System.Management.Automation.Runtimedefinedparameterdictionary object. Środowisko uruchomieniowe programu Windows PowerShell używa zwróconego obiektu do dodawania parametrów do Get-ChildItem polecenia cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Get-ChildItem cmdlet.

Ten dostawca nie implementuje tej metody.This provider does not implement this method. Jednak następujący kod jest domyślną implementacją tej metody.However, the following code is the default implementation of this method.

Zmiana nazw elementówRenaming Items

Aby zmienić nazwę elementu, dostawca kontenera programu Windows PowerShell musi zastąpić metodę System. Management. Automation. Provider. Containercmdletprovider. RenameItem * , aby obsługiwać wywołania z Rename-Item polecenia cmdlet.To rename an item, a Windows PowerShell container provider must override the System.Management.Automation.Provider.Containercmdletprovider.Renameitem* method to support calls from the Rename-Item cmdlet. Ta metoda zmienia nazwę elementu w określonej ścieżce na podaną nową nazwę.This method changes the name of the item at the specified path to the new name provided. Nowa nazwa musi być zawsze odnosząca się do elementu nadrzędnego (Container).The new name must always be relative to the parent item (container).

Ten dostawca nie przesłania metody System. Management. Automation. Provider. Containercmdletprovider. RenameItem * .This provider does not override the System.Management.Automation.Provider.Containercmdletprovider.Renameitem* method. Jednak jest to domyślna implementacja.However, the following is the default implementation.

Zapamiętaj o implementacji RenameItemThings to Remember About Implementing RenameItem

Poniższe warunki mogą dotyczyć implementacji elementu System. Management. Automation. Provider. Containercmdletprovider. RenameItem *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Renameitem*:

Dołączanie parametrów dynamicznych do polecenia cmdlet Zmień nazwę elementuAttaching Dynamic Parameters to the Rename-Item Cmdlet

Czasami Rename-Item polecenie cmdlet wymaga dodatkowych parametrów, które są określone dynamicznie w czasie wykonywania.Sometimes the Rename-Item cmdlet requires additional parameters that are specified dynamically at runtime. Aby zapewnić te parametry dynamiczne, dostawca kontenera programu Windows PowerShell musi zaimplementować metodę System. Management. Automation. Provider. Containercmdletprovider. Renameitemdynamicparameters * .To provide these dynamic parameters, Windows PowerShell container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Renameitemdynamicparameters* method. Ta metoda pobiera parametry dla elementu w wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola, które mają atrybuty analizy podobne do klasy poleceń cmdlet lub obiektu System. Management. Automation. Runtimedefinedparameterdictionary .This method retrieves the parameters for the item at the indicated path and returns an object that has properties and fields with parsing attributes similar to a cmdlet class or a System.Management.Automation.Runtimedefinedparameterdictionary object. Środowisko uruchomieniowe programu Windows PowerShell używa zwróconego obiektu do dodawania parametrów do Rename-Item polecenia cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Rename-Item cmdlet.

Ten dostawca kontenera nie implementuje tej metody.This container provider does not implement this method. Jednak następujący kod jest domyślną implementacją tej metody.However, the following code is the default implementation of this method.

Tworzenie nowych elementówCreating New Items

Aby utworzyć nowe elementy, dostawca kontenera musi zaimplementować metodę System. Management. Automation. Provider. Containercmdletprovider. newItem * do obsługi wywołań z New-Item polecenia cmdlet.To create new items, a container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Newitem* method to support calls from the New-Item cmdlet. Ta metoda tworzy element danych znajdujący się w określonej ścieżce.This method creates a data item located at the specified path. typeParametr polecenia cmdlet zawiera typ zdefiniowany przez dostawcę dla nowego elementu.The type parameter of the cmdlet contains the provider-defined type for the new item. Na przykład dostawca systemu plików używa type parametru o wartości "File" lub "Directory".For example, the FileSystem provider uses a type parameter with a value of "file" or "directory". newItemValueParametr polecenia cmdlet określa wartość specyficzną dla dostawcy dla nowego elementu.The newItemValue parameter of the cmdlet specifies a provider-specific value for the new item.

Poniżej przedstawiono implementację metody System. Management. Automation. Provider. Containercmdletprovider. newItem * dla tego dostawcy.Here is the implementation of the System.Management.Automation.Provider.Containercmdletprovider.Newitem* method for this provider.

protected override void NewItem( string path, string type, object newItemValue )
{
    // Create the new item here after
    // performing necessary validations
    //
    // WriteItemObject(newItemValue, path, false);

    // Example
    //
    // if (ShouldProcess(path, "new item"))
    // {
    //      // Create a new item and then call WriteObject
    //      WriteObject(newItemValue, path, false);
    // }

} // NewItem
{
    case 1:
        {
            string name = pathChunks[0];

            if (TableNameIsValid(name))
            {
                tableName = name;
                retVal = PathType.Table;
            }
        }
        break;

    case 2:
        {
            string name = pathChunks[0];

Zapamiętaj o implementacji NewItemThings to Remember About Implementing NewItem

Poniższe warunki mogą dotyczyć implementacji elementu System. Management. Automation. Provider. Containercmdletprovider. newItem *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Newitem*:

Dołączanie parametrów dynamicznych do polecenia cmdlet New-ItemAttaching Dynamic Parameters to the New-Item Cmdlet

Czasami New-Item polecenie cmdlet wymaga dodatkowych parametrów, które są określone dynamicznie w czasie wykonywania.Sometimes the New-Item cmdlet requires additional parameters that are specified dynamically at runtime. Aby zapewnić te parametry dynamiczne, dostawca kontenera musi zaimplementować metodę System. Management. Automation. Provider. Containercmdletprovider. Newitemdynamicparameters * .To provide these dynamic parameters, the container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Newitemdynamicparameters* method. Ta metoda pobiera parametry dla elementu w wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola, które mają atrybuty analizy podobne do klasy poleceń cmdlet lub obiektu System. Management. Automation. Runtimedefinedparameterdictionary .This method retrieves the parameters for the item at the indicated path and returns an object that has properties and fields with parsing attributes similar to a cmdlet class or a System.Management.Automation.Runtimedefinedparameterdictionary object. Środowisko uruchomieniowe programu Windows PowerShell używa zwróconego obiektu do dodawania parametrów do New-Item polecenia cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the New-Item cmdlet.

Ten dostawca nie implementuje tej metody.This provider does not implement this method. Jednak następujący kod jest domyślną implementacją tej metody.However, the following code is the default implementation of this method.

Usuwanie elementówRemoving Items

Aby usunąć elementy, dostawca programu Windows PowerShell musi zastąpić metodę System. Management. Automation. Provider. Containercmdletprovider. RemoveItem * , aby obsługiwać wywołania z Remove-Item polecenia cmdlet.To remove items, the Windows PowerShell provider must override the System.Management.Automation.Provider.Containercmdletprovider.Removeitem* method to support calls from the Remove-Item cmdlet. Ta metoda usuwa element z magazynu danych w określonej ścieżce.This method deletes an item from the data store at the specified path. Jeśli recurse parametr Remove-Item polecenia cmdlet jest ustawiony na true , Metoda usuwa wszystkie elementy podrzędne niezależnie od ich poziomu.If the recurse parameter of the Remove-Item cmdlet is set to true, the method removes all child items regardless of their level. Jeśli parametr jest ustawiony na false , Metoda usuwa tylko jeden element w określonej ścieżce.If the parameter is set to false, the method removes only a single item at the specified path.

Ten dostawca nie obsługuje usuwania elementu.This provider does not support item removal. Jednak następujący kod jest domyślną implementacją System. Management. Automation. Provider. Containercmdletprovider. RemoveItem *.However, the following code is the default implementation of System.Management.Automation.Provider.Containercmdletprovider.Removeitem*.

Zapamiętaj o implementacji RemoveItemThings to Remember About Implementing RemoveItem

Poniższe warunki mogą dotyczyć implementacji elementu System. Management. Automation. Provider. Containercmdletprovider. newItem *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Newitem*:

Dołączanie parametrów dynamicznych do polecenia cmdlet Remove-ItemAttaching Dynamic Parameters to the Remove-Item Cmdlet

Czasami Remove-Item polecenie cmdlet wymaga dodatkowych parametrów, które są określone dynamicznie w czasie wykonywania.Sometimes the Remove-Item cmdlet requires additional parameters that are specified dynamically at runtime. Aby zapewnić te parametry dynamiczne, dostawca kontenera musi zaimplementować metodę System. Management. Automation. Provider. Containercmdletprovider. Removeitemdynamicparameters * , aby obsłużyć te parametry.To provide these dynamic parameters, the container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters* method to handle these parameters. Ta metoda pobiera parametry dynamiczne dla elementu w wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola, które mają atrybuty analizy podobne do klasy poleceń cmdlet lub obiektu System. Management. Automation. Runtimedefinedparameterdictionary .This method retrieves the dynamic parameters for the item at the indicated path and returns an object that has properties and fields with parsing attributes similar to a cmdlet class or a System.Management.Automation.Runtimedefinedparameterdictionary object. Środowisko uruchomieniowe programu Windows PowerShell używa zwróconego obiektu do dodawania parametrów do Remove-Item polecenia cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Remove-Item cmdlet.

Ten dostawca kontenera nie implementuje tej metody.This container provider does not implement this method. Jednak następujący kod jest domyślną implementacją System. Management. Automation. Provider. Containercmdletprovider. Removeitemdynamicparameters *.However, the following code is the default implementation of System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*.

Wykonywanie zapytań dotyczących elementów podrzędnychQuerying for Child Items

Aby sprawdzić, czy elementy podrzędne istnieją w określonej ścieżce, dostawca kontenera programu Windows PowerShell musi zastąpić metodę System. Management. Automation. Provider. Containercmdletprovider. Haschilditems * .To check to see if child items exist at the specified path, the Windows PowerShell container provider must override the System.Management.Automation.Provider.Containercmdletprovider.Haschilditems* method. Ta metoda zwraca wartość true , jeśli element ma elementy podrzędne i false w przeciwnym razie.This method returns true if the item has children, and false otherwise. Dla ścieżki o wartości null lub pustej Metoda traktuje wszystkie elementy w magazynie danych jako elementy podrzędne i zwraca true .For a null or empty path, the method considers any items in the data store to be children and returns true.

Oto przesłonięcie metody System. Management. Automation. Provider. Containercmdletprovider. Haschilditems * .Here is the override for the System.Management.Automation.Provider.Containercmdletprovider.Haschilditems* method. Jeśli istnieje więcej niż dwie części ścieżki utworzone przez metodę pomocnika ChunkPath, metoda zwraca false , ponieważ zdefiniowane są tylko kontener bazy danych i kontener tabeli.If there are more than two path parts created by the ChunkPath helper method, the method returns false, since only a database container and a table container are defined. Aby uzyskać więcej informacji na temat tej metody pomocnika, zobacz Metoda ChunkPath została omówiona w temacie Tworzenie dostawcy elementów środowiska Windows PowerShell.For more information about this helper method, see the ChunkPath method is discussed in Creating a Windows PowerShell Item Provider.

protected override bool HasChildItems( string path )
{
    return false;
} // HasChildItems
        ErrorCategory.InvalidOperation, tableName));
}

return results;

Zapamiętaj o implementacji HasChildItemsThings to Remember About Implementing HasChildItems

Poniższe warunki mogą dotyczyć implementacji elementu System. Management. Automation. Provider. Containercmdletprovider. Haschilditems *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*:

Kopiowanie elementówCopying Items

Aby skopiować elementy, dostawca kontenera musi zaimplementować metodę System. Management. Automation. Provider. ContainerCmdletProvider. CopyItem , aby obsługiwać wywołania z Copy-Item polecenia cmdlet.To copy items, the container provider must implement the System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem method to support calls from the Copy-Item cmdlet. Ta metoda kopiuje element danych z lokalizacji wskazywanej przez path parametr polecenia cmdlet do lokalizacji wskazywanej przez copyPath parametr.This method copies a data item from the location indicated by the path parameter of the cmdlet to the location indicated by the copyPath parameter. Jeśli recurse parametr jest określony, Metoda kopiuje wszystkie kontenery podrzędne.If the recurse parameter is specified, the method copies all sub-containers. Jeśli parametr nie jest określony, Metoda kopiuje tylko jeden poziom elementów.If the parameter is not specified, the method copies only a single level of items.

Ten dostawca nie implementuje tej metody.This provider does not implement this method. Jednak następujący kod jest domyślną implementacją System. Management. Automation. Provider. ContainerCmdletProvider. CopyItem.However, the following code is the default implementation of System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.

Zapamiętaj o implementacji CopyItemThings to Remember About Implementing CopyItem

Poniższe warunki mogą dotyczyć implementacji elementu System. Management. Automation. Provider. ContainerCmdletProvider. CopyItem:The following conditions may apply to your implementation of System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:

Dołączanie parametrów dynamicznych do polecenia cmdlet Copy-ItemAttaching Dynamic Parameters to the Copy-Item Cmdlet

Czasami Copy-Item polecenie cmdlet wymaga dodatkowych parametrów, które są określone dynamicznie w czasie wykonywania.Sometimes the Copy-Item cmdlet requires additional parameters that are specified dynamically at runtime. Aby zapewnić te parametry dynamiczne, dostawca kontenera programu Windows PowerShell musi zaimplementować metodę System. Management. Automation. Provider. Containercmdletprovider. Copyitemdynamicparameters * , aby obsłużyć te parametry.To provide these dynamic parameters, the Windows PowerShell container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters* method to handle these parameters. Ta metoda pobiera parametry dla elementu w wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola, które mają atrybuty analizy podobne do klasy poleceń cmdlet lub obiektu System. Management. Automation. Runtimedefinedparameterdictionary .This method retrieves the parameters for the item at the indicated path and returns an object that has properties and fields with parsing attributes similar to a cmdlet class or a System.Management.Automation.Runtimedefinedparameterdictionary object. Środowisko uruchomieniowe programu Windows PowerShell używa zwróconego obiektu do dodawania parametrów do Copy-Item polecenia cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Copy-Item cmdlet.

Ten dostawca nie implementuje tej metody.This provider does not implement this method. Jednak następujący kod jest domyślną implementacją System. Management. Automation. Provider. Containercmdletprovider. Copyitemdynamicparameters *.However, the following code is the default implementation of System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*.

Przykładowy kodCode Sample

Aby uzyskać kompletny przykładowy kod, zobacz przykład kodu AccessDbProviderSample04.For complete sample code, see AccessDbProviderSample04 Code Sample.

Kompilowanie dostawcy środowiska Windows PowerShellBuilding the Windows PowerShell Provider

Zobacz , jak zarejestrować polecenia cmdlet, dostawców i aplikacje hosta.See How to Register Cmdlets, Providers, and Host Applications.

Testowanie dostawcy programu Windows PowerShellTesting the Windows PowerShell Provider

Gdy dostawca środowiska Windows PowerShell został zarejestrowany w programie Windows PowerShell, można go przetestować, uruchamiając obsługiwane polecenia cmdlet w wierszu polecenia.When your Windows PowerShell provider has been registered with Windows PowerShell, you can test it by running the supported cmdlets on the command line. Należy pamiętać, że Poniższe przykładowe dane wyjściowe używają fikcyjnej bazy danych programu Access.Be aware that the following example output uses a fictitious Access database.

  1. Uruchom Get-ChildItem polecenie cmdlet, aby pobrać listę elementów podrzędnych z tabeli Customers w bazie danych programu Access.Run the Get-ChildItem cmdlet to retrieve the list of child items from a Customers table in the Access database.

    Get-ChildItem mydb:customers
    

    Pojawią się następujące dane wyjściowe.The following output appears.

    PSPath        : AccessDB::customers
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : True
    Data          : System.Data.DataRow
    Name          : Customers
    RowCount      : 91
    Columns       :
    
  2. Ponownie uruchom Get-ChildItem polecenie cmdlet, aby pobrać dane tabeli.Run the Get-ChildItem cmdlet again to retrieve the data of a table.

    (Get-ChildItem mydb:customers).data
    

    Pojawią się następujące dane wyjściowe.The following output appears.

    TABLE_CAT   : c:\PS\northwind
    TABLE_SCHEM :
    TABLE_NAME  : Customers
    TABLE_TYPE  : TABLE
    REMARKS     :
    
  3. Teraz Użyj Get-Item polecenia cmdlet, aby pobrać elementy w wierszu 0 w tabeli danych.Now use the Get-Item cmdlet to retrieve the items at row 0 in the data table.

    Get-Item mydb:\customers\0
    

    Pojawią się następujące dane wyjściowe.The following output appears.

    PSPath        : AccessDB::customers\0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data          : System.Data.DataRow
    RowNumber     : 0
    
  4. Ponownie używane Get-Item do pobierania danych dla elementów w wierszu 0.Reuse Get-Item to retrieve the data for the items in row 0.

    (Get-Item mydb:\customers\0).data
    

    Pojawią się następujące dane wyjściowe.The following output appears.

    CustomerID   : 1234
    CompanyName  : Fabrikam
    ContactName  : Eric Gruber
    ContactTitle : President
    Address      : 4567 Main Street
    City         : Buffalo
    Region       : NY
    PostalCode   : 98052
    Country      : USA
    Phone        : (425) 555-0100
    Fax          : (425) 555-0101
    
  5. Teraz Użyj New-Item polecenia cmdlet, aby dodać wiersz do istniejącej tabeli.Now use the New-Item cmdlet to add a row to an existing table. PathParametr określa pełną ścieżkę do wiersza i musi wskazywać numer wiersza, który jest większy niż istniejąca liczba wierszy w tabeli.The Path parameter specifies the full path to the row, and must indicate a row number that is greater than the existing number of rows in the table. TypeParametr wskazuje "wiersz", aby określić, który typ elementu ma zostać dodany.The Type parameter indicates "row" to specify that type of item to add. Na koniec Value parametr określa rozdzielaną przecinkami listę wartości kolumn dla wiersza.Finally, the Value parameter specifies a comma-delimited list of column values for the row.

    New-Item -Path mydb:\Customers\3 -ItemType "row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
    
  6. Sprawdź poprawność operacji nowego elementu w następujący sposób.Verify the correctness of the new item operation as follows.

    PS mydb:\> cd Customers
    PS mydb:\Customers> (Get-Item 3).data
    

    Pojawią się następujące dane wyjściowe.The following output appears.

    ID        : 3
    FirstName : Eric
    LastName  : Gruber
    Email     : ericgruber@fabrikam.com
    Title     : President
    Company   : Fabrikam
    WorkPhone : (425) 555-0100
    Address   : 4567 Main Street
    City      : Buffalo
    State     : NY
    Zip       : 98052
    Country   : USA
    

Zobacz teżSee Also

Tworzenie dostawców programu Windows PowerShellCreating Windows PowerShell Providers

Projektowanie dostawcy programu Windows PowerShellDesigning Your Windows PowerShell Provider

Implementowanie dostawcy programu Windows PowerShell dla elementuImplementing an Item Windows PowerShell Provider

Implementowanie dostawcy nawigacji programu Windows PowerShellImplementing a Navigation Windows PowerShell Provider

Jak zarejestrować polecenia cmdlet, dostawców i aplikacje hostaHow to Register Cmdlets, Providers, and Host Applications

Windows PowerShell SDKWindows PowerShell SDK

Windows PowerShell — przewodnik programistyWindows PowerShell Programmer's Guide