Tworzenie dostawcy kontenerów programu Windows PowerShell

W tym temacie opisano sposób tworzenia dostawcy Windows PowerShell, który może działać w wielowarstwowych magazynach danych. 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. Zezwalając użytkownikowi na pracę w tych węzłach podrzędnych, użytkownik może wchodzić w interakcje hierarchiczne za pośrednictwem magazynu danych.

Dostawcy, którzy mogą pracować z magazynami danych na wielu poziomie, są nazywani Windows PowerShell kontenerów. Należy jednak pamiętać, że dostawca Windows PowerShell kontenerów może być używany tylko wtedy, gdy istnieje jeden kontener (bez kontenerów zagnieżdżonych) z elementami w nim. Jeśli istnieją zagnieżdżone kontenery, należy zaimplementować Windows PowerShell nawigacji. Aby uzyskać więcej informacji na temat implementowania Windows PowerShell nawigacji, zobacz Creating a Windows PowerShell Navigation Provider.

Uwaga

Możesz pobrać plik źródłowy języka C# (AccessDBSampleProvider04.cs) dla tego dostawcy przy użyciu zestawu Microsoft Windows Software Development Kit dla składników środowiska uruchomieniowego Windows Vista i .NET Framework 3.0. Aby uzyskać instrukcje dotyczące pobierania, zobacz How to Install Windows PowerShell and Download the Windows PowerShell SDK (Jak zainstalować zestaw SDK Windows PowerShell). Pobrane pliki źródłowe są dostępne w <PowerShell Samples> katalogu . Aby uzyskać więcej informacji na temat Windows PowerShell implementacji innych dostawców, zobacz Projektowanie dostawcy Windows PowerShell sieci.

Dostawca Windows PowerShell kontenerów zdefiniowany w tym miejscu definiuje bazę danych jako jej pojedynczy kontener z tabelami i wierszami bazy danych zdefiniowanymi jako elementy kontenera.

Przestroga

Należy pamiętać, że w tym projekcie przyjęto założenie, że baza danych zawiera pole o identyfikatorze nazwy, a typ pola to LongInteger.

Definiowanie klasy Windows PowerShell kontenera

Dostawca Windows PowerShell kontenerów musi zdefiniować klasę .NET pochodzącą z klasy bazowej System.Management.Automation.Provider.Containercmdletprovider. Poniżej znajduje się definicja klasy dla dostawcy Windows PowerShell kontenerów opisana w tej sekcji.

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

Zwróć uwagę, że w tej definicji klasy atrybut System.Management.Automation.Provider.Cmdletproviderattribute zawiera dwa parametry. Pierwszy parametr określa przyjazną dla użytkownika nazwę dostawcy, która jest używana przez Windows PowerShell. Drugi parametr określa Windows PowerShell możliwości, które dostawca uwidacznia w środowisku uruchomieniowym Windows PowerShell podczas przetwarzania poleceń. W przypadku tego dostawcy nie ma żadnych Windows PowerShell, które zostały dodane.

Definiowanie podstawowych funkcji

Zgodnie z opisem w te Windows PowerShell Dostawcyzasobów klasa System.Management.Automation.Provider.Containercmdletprovider pochodzi z kilku innych klas, które zapewniały różne funkcje dostawcy. Dostawca Windows PowerShell kontenerów musi zatem definiować wszystkie funkcje udostępniane przez te klasy.

Aby zaimplementować funkcje dodawania informacji inicjowania specyficznych dla sesji i wydawania zasobów używanych przez dostawcę,zobacz Tworzenie podstawowego Windows PowerShell dostawcy . Jednak większość dostawców (w tym dostawca opisany tutaj) może używać domyślnej implementacji tej funkcji udostępnianej przez Windows PowerShell.

Aby uzyskać dostęp do magazynu danych, dostawca musi zaimplementować metody klasy bazowej System.Management.Automation.Provider.Drivecmdletprovider. Aby uzyskać więcej informacji na temat implementowania tych metod, zobacz Creating an Windows PowerShell Drive Provider.

Aby manipulować elementami magazynu danych, takimi jak pobieranie, ustawianie i czyszczenie elementów, dostawca musi zaimplementować metody dostarczane przez klasę bazową System.Management.Automation.Provider.Itemcmdletprovider. Aby uzyskać więcej informacji na temat implementowania tych metod, zobacz Creating an Windows PowerShell Item Provider (Tworzenie dostawcy Windows PowerShell elementów).

Pobieranie elementów podrzędnych

Aby pobrać element podrzędny, dostawca kontenera usługi Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* w celu obsługi wywołań z Get-ChildItem polecenia cmdlet . Ta metoda pobiera elementy podrzędne z magazynu danych i zapisuje je w potoku jako obiekty. Jeśli parametr polecenia cmdlet jest określony, metoda pobiera wszystkie dzieci niezależnie od recurse poziomu, na jakim się znajdują. Jeśli parametr recurse nie zostanie określony, metoda pobiera tylko jeden poziom dzieci.

Oto implementacja metody System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* dla tego dostawcy. Zwróć uwagę, ż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.

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

Co należy pamiętać o implementowanie getChildItems

Następujące warunki mogą dotyczyć implementacji systemu System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:

Dołączanie parametrów dynamicznych do Get-ChildItem cmdlet

Czasami Get-ChildItem polecenie cmdlet, które wywołuje element System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*, wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, Windows PowerShell kontenera musi zaimplementować metodę System.Management.Automation.Provider.Containercmdletprovider.Getchilditemsdynamicparameters*. Ta metoda pobiera parametry dynamiczne dla elementu we wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy polecenia cmdlet lub obiektu System.Management.Automation.Runtimedefinedparameterdictionary. Środowisko Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do Get-ChildItem polecenia cmdlet .

Ten Windows PowerShell kontenera nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.

Pobieranie nazw elementów podrzędnych

Aby pobrać nazwy elementów podrzędnych, dostawca kontenera usługi Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* w celu obsługi wywołań z polecenia cmdlet, gdy określono jego Get-ChildItem Name parametr. 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 określono parametr returnAllContainers polecenia cmdlet. Nazwa podrzędna to część liścia ścieżki. Na przykład nazwa podrzędna ścieżki, c:\windows\system32\abc.dll to "abc.dll". Nazwa podrzędna katalogu c:\windows\system32 to "system32".

Oto implementacja metody System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* dla tego dostawcy. Zwróć uwagę, ż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ę.

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

Co należy pamiętać o implementowania getChildNames

Następujące warunki mogą dotyczyć implementacji systemu System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:

Dołączanie parametrów dynamicznych do Get-ChildItem cmdlet (Name)

Czasami polecenie Get-ChildItem cmdlet (z parametrem ) wymaga dodatkowych parametrów, które są określane Name dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, Windows PowerShell kontenera musi zaimplementować metodę System.Management.Automation.Provider.Containercmdletprovider.Getchildnamesdynamicparameters*. Ta metoda pobiera parametry dynamiczne elementu we wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy polecenia cmdlet lub obiektu System.Management.Automation.Runtimedefinedparameterdictionary. Środowisko Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do Get-ChildItem polecenia cmdlet .

Ten dostawca nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.

Zmienianie nazw elementów

Aby zmienić nazwę elementu, dostawca kontenera Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.Containercmdletprovider.Renameitem* w celu obsługi wywołań z Rename-Item polecenia cmdlet . Ta metoda zmienia nazwę elementu w określonej ścieżce na nową podaną nazwę. Nowa nazwa musi być zawsze względna względem elementu nadrzędnego (kontenera).

Ten dostawca nie zastępuje metody System.Management.Automation.Provider.Containercmdletprovider.Renameitem*. Poniżej przedstawiono jednak implementację domyślną.

Co należy zapamiętać na temat implementowania renameitem

Następujące warunki mogą dotyczyć implementacji pliku System.Management.Automation.Provider.Containercmdletprovider.Renameitem*:

Dołączanie parametrów dynamicznych do Rename-Item cmdlet

Czasami polecenie Rename-Item cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby podać te parametry dynamiczne, Windows PowerShell kontener kontenerów musi zaimplementować metodę System.Management.Automation.Provider.Containercmdletprovider.Renameitemdynamicparameters*. Ta metoda pobiera parametry elementu we wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy polecenia cmdlet lub obiektu System.Management.Automation.Runtimedefinedparameterdictionary. Środowisko Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do Rename-Item polecenia cmdlet .

Ten dostawca kontenerów nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.

Tworzenie nowych elementów

Aby utworzyć nowe elementy, dostawca kontenera musi zaimplementować metodę System.Management.Automation.Provider.Containercmdletprovider.Newitem*, aby obsługiwać wywołania z New-Item polecenia cmdlet . Ta metoda tworzy element danych znajdujący się w określonej ścieżce. Parametr type polecenia cmdlet zawiera typ zdefiniowany przez dostawcę dla nowego elementu. Na przykład dostawca FileSystem używa parametru o type wartości "file" lub "directory". Parametr polecenia cmdlet określa wartość specyficzną dla dostawcy newItemValue dla nowego elementu.

Oto implementacja metody System.Management.Automation.Provider.Containercmdletprovider.Newitem* dla tego dostawcy.

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

Co należy zapamiętać na temat implementowania newItem

Następujące warunki mogą dotyczyć implementacji rozwiązania System.Management.Automation.Provider.Containercmdletprovider.Newitem*:

Dołączanie parametrów dynamicznych do New-Item cmdlet

Czasami polecenie New-Item cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby podać te parametry dynamiczne, dostawca kontenera musi zaimplementować metodę System.Management.Automation.Provider.Containercmdletprovider.Newitemdynamicparameters*. Ta metoda pobiera parametry elementu we wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy polecenia cmdlet lub obiektu System.Management.Automation.Runtimedefinedparameterdictionary. Środowisko Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do New-Item polecenia cmdlet .

Ten dostawca nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.

Usuwanie elementów

Aby usunąć elementy, Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.Containercmdletprovider.Removeitem* w celu obsługi wywołań z Remove-Item polecenia cmdlet. Ta metoda usuwa element z magazynu danych w określonej ścieżce. Jeśli parametr polecenia cmdlet jest ustawiony na , metoda usuwa wszystkie elementy podrzędne niezależnie recurse Remove-Item od ich true poziomu. Jeśli parametr jest ustawiony na false , metoda usuwa tylko jeden element w określonej ścieżce.

Ten dostawca nie obsługuje usuwania elementów. Jednak poniższy kod jest domyślną implementacją rozwiązania System.Management.Automation.Provider.Containercmdletprovider.Removeitem*.

Co należy zapamiętać na temat implementowania RemoveItem

Następujące warunki mogą dotyczyć implementacji rozwiązania System.Management.Automation.Provider.Containercmdletprovider.Newitem*:

Dołączanie parametrów dynamicznych do Remove-Item cmdlet

Czasami polecenie Remove-Item cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby podać te parametry dynamiczne, dostawca kontenera musi zaimplementować metodę System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*, aby obsłużyć te parametry. Ta metoda pobiera parametry dynamiczne elementu we wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy polecenia cmdlet lub obiektu System.Management.Automation.Runtimedefinedparameterdictionary. Środowisko Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do Remove-Item polecenia cmdlet .

Ten dostawca kontenerów nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją system.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*.

Wykonywanie zapytań o elementy podrzędne

Aby sprawdzić, czy elementy podrzędne istnieją w określonej ścieżce, dostawca kontenera usługi Windows PowerShell musi zastąpić metodę System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*. Ta metoda zwraca true wartość , jeśli element ma dzieci, i w przeciwnym false razie. W przypadku ścieżki o wartości null lub pustej metoda uznaje wszystkie elementy w magazynie danych za elementy children i zwraca wartość true .

Oto przesłonięcie metody System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*. Jeśli istnieją więcej niż dwie części ścieżki utworzone przez metodę pomocnika ChunkPath, metoda zwraca wartość , ponieważ definiowany jest tylko kontener bazy danych i false kontener tabeli. Aby uzyskać więcej informacji na temat tej metody pomocnika, zobacz ChunkPath method is discussed in Creating a Windows PowerShell Item Provider (Tworzenie dostawcy Windows PowerShell item).

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

return results;

Co należy zapamiętać na temat implementowania hasChildItems

Następujące warunki mogą dotyczyć implementacji rozwiązania System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*:

Kopiowanie elementów

Aby skopiować elementy, dostawca kontenera musi zaimplementować metodę System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem w celu obsługi wywołań z Copy-Item polecenia cmdlet . Ta metoda kopiuje element danych z lokalizacji wskazanej przez parametr polecenia cmdlet do lokalizacji path wskazanej przez copyPath parametr . Jeśli parametr recurse jest określony, metoda kopiuje wszystkie kontenery podrzędne. Jeśli parametr nie zostanie określony, metoda kopiuje tylko jeden poziom elementów.

Ten dostawca nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją system.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.

Co należy zapamiętać na temat implementowania copyItem

Następujące warunki mogą dotyczyć implementacji pliku System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:

Dołączanie parametrów dynamicznych do Copy-Item cmdlet

Czasami polecenie Copy-Item cmdlet wymaga dodatkowych parametrów, które są określane dynamicznie w czasie wykonywania. Aby zapewnić te parametry dynamiczne, dostawca kontenera usługi Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*, aby obsłużyć te parametry. Ta metoda pobiera parametry elementu we wskazanej ścieżce i zwraca obiekt, który ma właściwości i pola z atrybutami analizowania podobnymi do klasy polecenia cmdlet lub obiektu System.Management.Automation.Runtimedefinedparameterdictionary. Środowisko Windows PowerShell używa zwróconego obiektu w celu dodania parametrów do Copy-Item polecenia cmdlet .

Ten dostawca nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją system.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*.

Przykład kodu

Aby uzyskać kompletny przykładowy kod, zobacz AccessDbProviderSample04 Code Sample (Przykładowy kod AccessDbProviderSample04).

Tworzenie dostawcy Windows PowerShell aplikacji

Zobacz How to Register Cmdlets, Providers, and Host Applications (Jak rejestrować polecenia cmdlet, dostawców i aplikacje hosta).

Testowanie dostawcy Windows PowerShell danych

Gdy dostawca Windows PowerShell został zarejestrowany w Windows PowerShell, możesz go przetestować, uruchamiając obsługiwane polecenia cmdlet w wierszu polecenia. Należy pamiętać, że następujące przykładowe dane wyjściowe wykorzystują fikcyjną bazę danych programu Access.

  1. Uruchom polecenie Get-ChildItem cmdlet , aby pobrać listę elementów podrzędnych z tabeli Customers w bazie danych programu Access.

    Get-ChildItem mydb:customers
    

    Wyświetlone są następujące dane wyjściowe.

    PSPath        : AccessDB::customers
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : True
    Data          : System.Data.DataRow
    Name          : Customers
    RowCount      : 91
    Columns       :
    
  2. Uruchom ponownie Get-ChildItem polecenie cmdlet , aby pobrać dane tabeli.

    (Get-ChildItem mydb:customers).data
    

    Wyświetlone są następujące dane wyjściowe.

    TABLE_CAT   : c:\PS\northwind
    TABLE_SCHEM :
    TABLE_NAME  : Customers
    TABLE_TYPE  : TABLE
    REMARKS     :
    
  3. Teraz użyj polecenia Get-Item cmdlet , aby pobrać elementy w wierszu 0 w tabeli danych.

    Get-Item mydb:\customers\0
    

    Wyświetlone są następujące dane wyjściowe.

    PSPath        : AccessDB::customers\0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data          : System.Data.DataRow
    RowNumber     : 0
    
  4. Użyj Get-Item ponownie, aby pobrać dane dla elementów w wierszu 0.

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

    Wyświetlone są następujące dane wyjściowe.

    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. Parametr określa pełną ścieżkę do wiersza i musi wskazywać numer wiersza, który jest większy niż istniejąca liczba Path wierszy w tabeli. Parametr Type wskazuje "wiersz", aby określić typ elementu do dodania. Na koniec parametr określa rozdzielaną przecinkami Value listę wartości kolumn dla wiersza.

    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.

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

    Wyświetlone są następujące dane wyjściowe.

    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ż

Tworzenie Windows PowerShell dostawców

Projektowanie dostawcy programu Windows PowerShell

Implementowanie dostawcy Windows PowerShell elementu

Implementowanie dostawcy Windows PowerShell nawigacji

Jak rejestrować polecenia cmdlet, dostawców i aplikacje hosta

Windows PowerShell SDK

Windows PowerShell — przewodnik programisty