Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten temat opisuje, jak stworzyć dostawcę Windows PowerShell, który pozwala użytkownikowi manipulować treścią elementów w magazynie danych. W konsekwencji dostawca, który może manipulować treścią elementów, nazywany jest dostawcą treści Windows PowerShell.
Uwaga / Notatka
Możesz pobrać plik źródłowy C# (AccessDBSampleProvider06.cs) tego dostawcy za pomocą Microsoft Windows Software Development Kit for Windows Vista oraz .NET Framework 3.0 Runtime Components. Instrukcje pobrania można znaleźć w sekcji Jak zainstalować Windows PowerShell oraz pobierz Windows PowerShell SDK. Pobrane pliki źródłowe są dostępne w katalogu <PowerShell Samples> . Więcej informacji o innych implementacjach dostawców Windows PowerShell można znaleźć w artykule Projektowanie swojego dostawcy Windows PowerShell.
Zdefiniuj klasę dostawcy treści Windows PowerShell
Dostawca treści w Windows PowerShell musi stworzyć klasę .NET wspierającą interfejs System.Management.Automation.Provider.IContentCmdletProvider . Oto definicja klasy dostawcy przedmiotów opisana w tej sekcji.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider, IContentCmdletProvider
Należy zauważyć, że w tej definicji klasy atrybut System.Management.Automation.Provider.CmdletProviderAttribute zawiera dwa parametry. Pierwszy parametr określa przyjazną dla użytkownika nazwę dostawcy używanego przez Windows PowerShell. Drugi parametr określa specyficzne możliwości Windows PowerShell, które dostawca udostępnia środowisku wykonawczym Windows PowerShell podczas przetwarzania poleceń. Dla tego dostawcy nie ma dodatkowych funkcji specyficznych dla Windows PowerShell.
Definiuj funkcjonalność klasy bazowej
Jak opisano w książce Design Your Windows PowerShell Provider, klasa System.Management.Automation.Provider.NavigationCmdletProvider pochodzi z kilku innych klas, które zapewniały różne funkcje dostawców. Dostawca treści w Windows PowerShell zazwyczaj definiuje więc całą funkcjonalność oferowaną przez te klasy.
Aby uzyskać więcej informacji o tym, jak zaimplementować funkcje dodawania informacji o inicjalizacji specyficznej dla sesji oraz uwalniania zasobów używanych przez dostawcę, zobacz Tworzenie podstawowego dostawcy Windows PowerShell. Jednak większość dostawców, w tym opisany tutaj, może korzystać z domyślnej implementacji tej funkcjonalności oferowanej przez Windows PowerShell.
Aby uzyskać dostęp do magazynu danych, dostawca musi wdrożyć metody podstawowej klasy System.Management.Automation.Provider.DriveCmdletProvider . Więcej informacji o implementacji tych metod można znaleźć w artykule Tworzenie dostawcy dysków Windows PowerShell.
Aby manipulować elementami magazynu danych, takimi jak pobieranie, ustawianie i czyszczenie elementów, dostawca musi wdrożyć metody dostępne przez klasę bazową System.Management.Automation.Provider.ItemCmdletProvider . Więcej informacji o implementacji tych metod można znaleźć w artykule Tworzenie dostawcy elementów Windows PowerShell.
Aby pracować na wielowarstwowych magazynach danych, dostawca musi wdrożyć metody dostępne przez klasę bazową System.Management.Automation.Provider.ContainerCmdletProvider . Więcej informacji na temat implementacji tych metod można znaleźć w artykule Tworzenie dostawcy kontenerów Windows PowerShell.
Aby wspierać polecenia rekurencyjne, zagnieżdżone kontenery i ścieżki względne, dostawca musi zaimplementować klasę bazową System.Management.Automation.Provider.NavigationCmdletProvider . Dodatkowo, ten dostawca treści Windows PowerShell może dołączyć interfejs System.Management.Automation.Provider.IContentCmdletProvider do klasy bazowej System.Management.Automation.Provider.NavigationCmdletProvider i musi zatem implementować metody oferowane przez tę klasę. Więcej informacji można znaleźć w artykule Implementacja nawigacji w Windows PowerShell Provider.
Implementacja Content Readera
Aby odczytać treść z elementu, dostawca musi zaimplementować klasę czytelnika treści pochodzącą z System.Management.Automation.Provider.IContentReader. Czytnik treści tego dostawcy umożliwia dostęp do zawartości wiersza w tabeli danych. Klasa Content reader definiuje metodę odczytu , która pobiera dane ze wskazanego wiersza i zwraca listę reprezentującą te dane, metodę Seek przesuwającą czytnik treści, metodę Close zamykającą czytnik treści oraz metodę Dispose .
public class AccessDBContentReader : IContentReader
{
// A provider instance is required so as to get "content"
private AccessDBProvider provider;
private string path;
private long currentOffset;
internal AccessDBContentReader(string path, AccessDBProvider provider)
{
this.path = path;
this.provider = provider;
}
/// <summary>
/// Read the specified number of rows from the source.
/// </summary>
/// <param name="readCount">The number of items to
/// return.</param>
/// <returns>An array of elements read.</returns>
public IList Read(long readCount)
{
// Read the number of rows specified by readCount and increment
// offset
string tableName;
int rowNumber;
PathType type = provider.GetNamesFromPath(path, out tableName, out rowNumber);
Collection<DatabaseRowInfo> rows =
provider.GetRows(tableName);
Collection<DataRow> results = new Collection<DataRow>();
if (currentOffset < 0 || currentOffset >= rows.Count)
{
return null;
}
int rowsRead = 0;
while (rowsRead < readCount && currentOffset < rows.Count)
{
results.Add(rows[(int)currentOffset].Data);
rowsRead++;
currentOffset++;
}
return results;
} // Read
/// <summary>
/// Moves the content reader specified number of rows from the
/// origin
/// </summary>
/// <param name="offset">Number of rows to offset</param>
/// <param name="origin">Starting row from which to offset</param>
public void Seek(long offset, System.IO.SeekOrigin origin)
{
// get the number of rows in the table which will help in
// calculating current position
string tableName;
int rowNumber;
PathType type = provider.GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Invalid)
{
throw new ArgumentException("Path specified must represent a table or a row :" + path);
}
if (type == PathType.Table)
{
Collection<DatabaseRowInfo> rows = provider.GetRows(tableName);
int numRows = rows.Count;
if (offset > rows.Count)
{
throw new
ArgumentException(
"Offset cannot be greater than the number of rows available"
);
}
if (origin == System.IO.SeekOrigin.Begin)
{
// starting from Beginning with an index 0, the current offset
// has to be advanced to offset - 1
currentOffset = offset - 1;
}
else if (origin == System.IO.SeekOrigin.End)
{
// starting from the end which is numRows - 1, the current
// offset is so much less than numRows - 1
currentOffset = numRows - 1 - offset;
}
else
{
// calculate from the previous value of current offset
// advancing forward always
currentOffset += offset;
}
} // if (type...
else
{
// for row, the offset will always be set to 0
currentOffset = 0;
}
} // Seek
/// <summary>
/// Closes the content reader, so all members are reset
/// </summary>
public void Close()
{
Dispose();
} // Close
/// <summary>
/// Dispose any resources being used
/// </summary>
public void Dispose()
{
Seek(0, System.IO.SeekOrigin.Begin);
GC.SuppressFinalize(this);
} // Dispose
} // AccessDBContentReader
Wdrażanie Content Writera
Aby zapisać treść do elementu, dostawca musi zaimplementować klasę content writer pochodzącą z System.Management.Automation.Provider.IContentWriter. Klasa content writer definiuje metodę Write , która zapisuje określoną treść wiersza, metodę Seek przesuwającą content writera, metodę Close zamykającą content writera oraz metodę Dispose .
public class AccessDBContentWriter : IContentWriter
{
// A provider instance is required so as to get "content"
private AccessDBProvider provider;
private string path;
private long currentOffset;
internal AccessDBContentWriter(string path, AccessDBProvider provider)
{
this.path = path;
this.provider = provider;
}
/// <summary>
/// Write the specified row contents in the source
/// </summary>
/// <param name="content"> The contents to be written to the source.
/// </param>
/// <returns>An array of elements which were successfully written to
/// the source</returns>
///
public IList Write(IList content)
{
if (content == null)
{
return null;
}
// Get the total number of rows currently available it will
// determine how much to overwrite and how much to append at
// the end
string tableName;
int rowNumber;
PathType type = provider.GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
OdbcDataAdapter da = provider.GetAdapterForTable(tableName);
if (da == null)
{
return null;
}
DataSet ds = provider.GetDataSetForTable(da, tableName);
DataTable table = provider.GetDataTable(ds, tableName);
string[] colValues = (content[0] as string).Split(',');
// set the specified row
DataRow row = table.NewRow();
for (int i = 0; i < colValues.Length; i++)
{
if (!String.IsNullOrEmpty(colValues[i]))
{
row[i] = colValues[i];
}
}
//table.Rows.InsertAt(row, rowNumber);
// Update the table
table.Rows.Add(row);
da.Update(ds, tableName);
}
else
{
throw new InvalidOperationException("Operation not supported. Content can be added only for tables");
}
return null;
} // Write
/// <summary>
/// Moves the content reader specified number of rows from the
/// origin
/// </summary>
/// <param name="offset">Number of rows to offset</param>
/// <param name="origin">Starting row from which to offset</param>
public void Seek(long offset, System.IO.SeekOrigin origin)
{
// get the number of rows in the table which will help in
// calculating current position
string tableName;
int rowNumber;
PathType type = provider.GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Invalid)
{
throw new ArgumentException("Path specified should represent either a table or a row : " + path);
}
Collection<DatabaseRowInfo> rows =
provider.GetRows(tableName);
int numRows = rows.Count;
if (offset > rows.Count)
{
throw new
ArgumentException(
"Offset cannot be greater than the number of rows available"
);
}
if (origin == System.IO.SeekOrigin.Begin)
{
// starting from Beginning with an index 0, the current offset
// has to be advanced to offset - 1
currentOffset = offset - 1;
}
else if (origin == System.IO.SeekOrigin.End)
{
// starting from the end which is numRows - 1, the current
// offset is so much less than numRows - 1
currentOffset = numRows - 1 - offset;
}
else
{
// calculate from the previous value of current offset
// advancing forward always
currentOffset += offset;
}
} // Seek
/// <summary>
/// Closes the content reader, so all members are reset
/// </summary>
public void Close()
{
Dispose();
} // Close
/// <summary>
/// Dispose any resources being used
/// </summary>
public void Dispose()
{
Seek(0, System.IO.SeekOrigin.Begin);
GC.SuppressFinalize(this);
} // Dispose
} // AccessDBContentWriter
Pobieranie czytnika treści
Aby uzyskać treść z elementu, dostawca musi zaimplementować System.Management.Automation.Provider.IContentCmdletProvider.GetContentReader* wspierający Get-Content cmdlet. Ta metoda zwraca czytnik treści dla elementu znajdującego się na wyznaczonej ścieżce. Obiekt czytnika można wtedy otworzyć, aby odczytać treść.
Oto implementacja System.Management.Automation.Provider.IContentCmdletProvider.GetContentReader* dla tej metody dla tego dostawcy.
public IContentReader GetContentReader(string path)
{
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Invalid)
{
ThrowTerminatingInvalidPathException(path);
}
else if (type == PathType.Row)
{
throw new InvalidOperationException("contents can be obtained only for tables");
}
return new AccessDBContentReader(path, this);
} // GetContentReader
public IContentReader GetContentReader(string path)
{
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Invalid)
{
ThrowTerminatingInvalidPathException(path);
}
else if (type == PathType.Row)
{
throw new InvalidOperationException("contents can be obtained only for tables");
}
return new AccessDBContentReader(path, this);
} // GetContentReader
Rzeczy, o których warto pamiętać przy wdrażaniu GetContentReader
Następujące warunki mogą mieć zastosowanie do implementacji System.Management.Automation.Provider.IContentCmdletProvider.GetContentReader*:
Podczas definiowania klasy dostawcy, dostawca treści w systemie Windows PowerShell może deklarować możliwości dostawcy takich jak ExpandWildcards, Filter, Include lub Exclude, z listy System.Management.Automation.Provider.ProviderCapabilities . W takich przypadkach implementacja metody System.Management.Automation.Provider.IContentCmdletProvider.GetContentReader* musi zapewnić, że ścieżka przekazana metodzie spełnia wymagania określonych możliwości. Aby to zrobić, metoda powinna uzyskać dostęp do odpowiednich właściwości, na przykład do właściwości System.Management.Automation.Provider.CmdletProvider.Exclude* oraz System.Management.Automation.Provider.CmdletProvider.Include* .
Domyślnie nadpisania tej metody nie powinny pobierać czytnika obiektów ukrytych przed użytkownikiem, chyba że właściwość System.Management.Automation.Provider.CmdletProvider.Force* jest ustawiona na .
trueBłąd powinien zostać zapisany, jeśli ścieżka reprezentuje element ukryty przed użytkownikiem, a System.Management.Automation.Provider.CmdletProvider.Force* jest ustawione nafalse.
Przypisywanie parametrów dynamicznych do Get-Content Cmdlet
Cmdlet Get-Content może wymagać dodatkowych parametrów, które są określane dynamicznie w czasie działania. Aby zapewnić te parametry dynamiczne, dostawca treści Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.IContentCmdletProvider.GetContentReaderdynamicparameters* . Ta metoda pobiera parametry dynamiczne dla elementu na wskazanej ścieżce i zwraca obiekt o właściwościach i polach o atrybutach parsowania podobnych do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary . Środowisko uruchomieniowe Windows PowerShell wykorzystuje zwrócony obiekt do dodawania parametrów do cmdletu.
Ten dostawca kontenerów Windows PowerShell nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.
public object GetContentReaderDynamicParameters(string path)
{
return null;
}
public object GetContentReaderDynamicParameters(string path)
{
return null;
}
Odzyskiwanie autora treści
Aby napisać treść do elementu, dostawca musi wdrożyć System.Management.Automation.Provider.IContentCmdletProvider.GetContentWriter* wspierający Set-Content cmdlety i Add-Content . Ta metoda zwraca autora treści dla produktu znajdującego się na wyznaczonej ścieżce.
Oto implementacja System.Management.Automation.Provider.IContentCmdletProvider.GetContentWriter* dla tej metody.
public IContentWriter GetContentWriter(string path)
{
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Invalid)
{
ThrowTerminatingInvalidPathException(path);
}
else if (type == PathType.Row)
{
throw new InvalidOperationException("contents can be added only to tables");
}
return new AccessDBContentWriter(path, this);
}
public IContentWriter GetContentWriter(string path)
{
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Invalid)
{
ThrowTerminatingInvalidPathException(path);
}
else if (type == PathType.Row)
{
throw new InvalidOperationException("contents can be added only to tables");
}
return new AccessDBContentWriter(path, this);
}
Rzeczy, o których warto pamiętać przy wdrażaniu GetContentWriter
Następujące warunki mogą mieć zastosowanie do Twojej implementacji System.Management.Automation.Provider.IContentCmdletProvider.GetContentWriter*:
Podczas definiowania klasy dostawcy, dostawca treści w systemie Windows PowerShell może deklarować możliwości dostawcy takich jak ExpandWildcards, Filter, Include lub Exclude, z listy System.Management.Automation.Provider.ProviderCapabilities . W takich przypadkach implementacja metody System.Management.Automation.Provider.IContentCmdletProvider.GetContentWriter* musi zapewnić, że ścieżka przekazana metodzie spełnia wymagania określonych możliwości. Aby to zrobić, metoda powinna uzyskać dostęp do odpowiednich właściwości, na przykład do właściwości System.Management.Automation.Provider.CmdletProvider.Exclude* oraz System.Management.Automation.Provider.CmdletProvider.Include* .
Domyślnie nadpisywania tej metody nie powinny pobierać zapisu dla obiektów ukrytych przed użytkownikiem, chyba że właściwość System.Management.Automation.Provider.CmdletProvider.Force* jest ustawiona na .
trueBłąd powinien zostać zapisany, jeśli ścieżka reprezentuje element ukryty przed użytkownikiem, a System.Management.Automation.Provider.CmdletProvider.Force* jest ustawione nafalse.
Przypisywanie parametrów dynamicznych do Add-Content i Set-Content cmdlets
Cmdlets Add-Content and Set-Content mogą wymagać dodatkowych parametrów dynamicznych, które są dodawane w czasie działania. Aby zapewnić te dynamiczne parametry, dostawca treści Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.IContentCmdletProvider.GetContentWriterDynamicParameters* do obsługi tych parametrów. Ta metoda pobiera parametry dynamiczne dla elementu na wskazanej ścieżce i zwraca obiekt o właściwościach i polach o atrybutach parsowania podobnych do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary . Środowisko uruchomieniowe Windows PowerShell wykorzystuje zwrócony obiekt do dodawania parametrów do cmdletów.
Ten dostawca kontenerów Windows PowerShell nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.
public object GetContentWriterDynamicParameters(string path)
{
return null;
}
Zawartość clearingu
Twój dostawca treści implementuje metodę System.Management.Automation.Provider.IContentCmdletProvider.ClearContent* wspierając Clear-Content cmdlet. Ta metoda usuwa zawartość przedmiotu na wyznaczonej ścieżce, ale pozostawia go nienaruszonym.
Oto implementacja metody System.Management.Automation.Provider.IContentCmdletProvider.ClearContent* dla tego dostawcy.
public void ClearContent(string path)
{
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type != PathType.Table)
{
WriteError(new ErrorRecord(
new InvalidOperationException("Operation not supported. Content can be cleared only for table"),
"NotValidRow", ErrorCategory.InvalidArgument,
path));
return;
}
OdbcDataAdapter da = GetAdapterForTable(tableName);
if (da == null)
{
return;
}
DataSet ds = GetDataSetForTable(da, tableName);
DataTable table = GetDataTable(ds, tableName);
// Clear contents at the specified location
for (int i = 0; i < table.Rows.Count; i++)
{
table.Rows[i].Delete();
}
if (ShouldProcess(path, "ClearContent"))
{
da.Update(ds, tableName);
}
} // ClearContent
Rzeczy, o których warto pamiętać przy wdrażaniu ClearContent
Następujące warunki mogą mieć zastosowanie do implementacji System.Management.Automation.Provider.IContentCmdletProvider.ClearContent*:
Podczas definiowania klasy dostawcy, dostawca treści w systemie Windows PowerShell może deklarować możliwości dostawcy takich jak ExpandWildcards, Filter, Include lub Exclude, z listy System.Management.Automation.Provider.ProviderCapabilities . W takich przypadkach implementacja metody System.Management.Automation.Provider.IContentCmdletProvider.ClearContent* musi zapewnić, że ścieżka przekazana do metody spełnia wymagania określonych możliwości. Aby to zrobić, metoda powinna uzyskać dostęp do odpowiednich właściwości, na przykład do właściwości System.Management.Automation.Provider.CmdletProvider.Exclude* oraz System.Management.Automation.Provider.CmdletProvider.Include* .
Domyślnie, nadpisania tej metody nie powinny usuwać zawartości obiektów ukrytych przed użytkownikiem, chyba że właściwość System.Management.Automation.Provider.CmdletProvider.Force* jest ustawiona na .
trueBłąd powinien zostać zapisany, jeśli ścieżka reprezentuje element ukryty przed użytkownikiem, a System.Management.Automation.Provider.CmdletProvider.Force* jest ustawione nafalse.Twoja implementacja metody System.Management.Automation.Provider.IContentCmdletProvider.ClearContent* powinna wywołać System.Management.Automation.Provider.CmdletProvider.ShouldProcess i zweryfikować jej wartość zwrotną przed wprowadzeniem jakichkolwiek zmian w magazynie danych. Ta metoda służy do potwierdzenia wykonania operacji po zmianie magazynu danych, takiej jak czyszczenie treści. Metoda System.Management.Automation.Provider.CmdletProvider.ShouldProcess wysyła użytkownikowi nazwę zasobu do zmiany, a środowisko uruchomieniowe Windows PowerShell obsługuje wszelkie ustawienia wiersza poleceń lub zmienne preferencyjne, decydując, co powinno być wyświetlane.
Po wywołaniu System.Management.Automation.Provider.CmdletProvider.ShouldProcess return
true, metoda System.Management.Automation.Provider.IContentCmdletProvider.ClearContent* powinna wywołać metodę System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Ta metoda wysyła użytkownikowi wiadomość, aby uzyskać informację zwrotną w celu weryfikacji, czy operacja powinna być kontynuowana. Wywołanie do System.Management.Automation.Provider.CmdletProvider.ShouldContinue pozwala na dodatkowe sprawdzenie potencjalnie niebezpiecznych modyfikacji systemu.
Przypisywanie parametrów dynamicznych do Clear-Content Cmdlet
Cmdlet Clear-Content może wymagać dodatkowych parametrów dynamicznych dodawanych w czasie działania. Aby zapewnić te dynamiczne parametry, dostawca treści Windows PowerShell musi zaimplementować metodę System.Management.Automation.Provider.IContentCmdletProvider.ClearContentDynamicParameters* do obsługi tych parametrów. Ta metoda pobiera parametry dla przedmiotu na wskazanej ścieżce. Ta metoda pobiera parametry dynamiczne dla elementu na wskazanej ścieżce i zwraca obiekt o właściwościach i polach o atrybutach parsowania podobnych do klasy cmdlet lub obiektu System.Management.Automation.RuntimeDefinedParameterDictionary . Środowisko uruchomieniowe Windows PowerShell wykorzystuje zwrócony obiekt do dodawania parametrów do cmdletu.
Ten dostawca kontenerów Windows PowerShell nie implementuje tej metody. Jednak poniższy kod jest domyślną implementacją tej metody.
public object ClearContentDynamicParameters(string path)
{
return null;
}
public object ClearContentDynamicParameters(string path)
{
return null;
}
Przykładowy kod
Pełny przykładowy kod można znaleźć w AccessDbProviderSample06 Code Sample.
Definiowanie typów obiektów i formatowanie
Podczas pisania dostawcy może być konieczne dodanie członków do istniejących obiektów lub zdefiniowanie nowych. Gdy to zrobisz, musisz utworzyć plik Types, który Windows PowerShell może wykorzystać do identyfikacji członków obiektu, oraz plik Format, który definiuje, jak obiekt jest wyświetlany. Więcej informacji można znaleźć w artykule Rozszerzanie typów obiektów i formatowania.
Budowanie dostawcy Windows PowerShell
Zobacz Jak rejestrować cmdlety, dostawców i aplikacje hostów.
Testowanie dostawcy Windows PowerShell
Gdy Twój dostawca Windows PowerShell zostanie zarejestrowany w Windows PowerShell, możesz go przetestować, uruchamiając obsługiwane cmdlets w wierszu poleceń. Na przykład przetestuj dostawcę przykładowej treści.
Użyj cmdletu Get-Content , aby pobrać zawartość określonego elementu w tabeli bazy danych na ścieżce określonej parametrem Path . Parametr ten ReadCount określa liczbę elementów, które zdefiniowany czytnik treści ma odczytać (domyślnie 1). Za pomocą następującego wpisu polecenia cmdlet pobiera dwa wiersze (elementy) z tabeli i wyświetla ich treść. Należy zauważyć, że poniższy przykład wyjścia wykorzystuje fikcyjną bazę danych Access.
Get-Content -Path mydb:\Customers -ReadCount 2
ID : 1
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
ID : 2
FirstName : Eva
LastName : Corets
Email : evacorets@cohowinery.com
Title : Sales Representative
Company : Coho Winery
WorkPhone : (360) 555-0100
Address : 8910 Main Street
City : Cabmerlot
State : WA
Zip : 98089
Country : USA
Zobacz też
Tworzenie dostawców Windows PowerShell
Zaprojektuj swojego dostawcy Windows PowerShell
Rozszerzanie typów obiektów i formatowanie
Implementacja dostawcy nawigacji w Windows PowerShell