about_Functions_Advanced_Methods
Krótki opis
Opisuje, w jaki sposób funkcje określające CmdletBinding
atrybut mogą używać metod i właściwości, które są dostępne do skompilowanych poleceń cmdlet.
Długi opis
Funkcje określające CmdletBinding
atrybut mogą uzyskiwać dostęp do dodatkowych metod i właściwości za pośrednictwem zmiennej $PSCmdlet
. Metody te obejmują następujące metody:
- Te same metody przetwarzania wejściowego są dostępne dla wszystkich funkcji.
- Metody
ShouldProcess
iShouldContinue
używane do uzyskiwania opinii użytkowników przed wykonaniem akcji. - Metoda generowania
ThrowTerminatingError
rekordów błędów. - Kilka
Write
metod, które zwracają różne typy danych wyjściowych.
Wszystkie metody i właściwości klasy PSCmdlet są dostępne dla funkcji zaawansowanych. Aby uzyskać więcej informacji, zobacz System.Management.Automation.PSCmdlet.
Aby uzyskać więcej informacji na temat atrybutu CmdletBinding
, zobacz about_Functions_CmdletBindingAttribute. Aby zapoznać się z klasą CmdletBindingAttribute , zobacz System.Management.Automation.Cmdlet.CmdletBindingAttribute.
Metody przetwarzania danych wejściowych
Metody opisane w tej sekcji są określane jako metody przetwarzania danych wejściowych. W przypadku funkcji te trzy metody są reprezentowane przez begin
bloki funkcji , process
i end
. Program PowerShell 7.3 dodaje metodę procesu blokowego clean
.
Nie musisz używać żadnych z tych bloków w funkcjach. Jeśli nie używasz nazwanego bloku, program PowerShell umieszcza kod w end
bloku funkcji. Jeśli jednak używasz dowolnego z tych nazwanych bloków lub zdefiniuj dynamicparam
blok, musisz umieścić cały kod w nazwanym bloku.
W poniższym przykładzie przedstawiono konspekt funkcji, która zawiera begin
blok jednorazowego przetwarzania wstępnego, process
blok przetwarzania wielu rekordów i end
blok jednorazowego przetwarzania końcowego.
Function Test-ScriptCmdlet
{
[CmdletBinding(SupportsShouldProcess=$True)]
Param ($Parameter1)
begin{}
process{}
end{}
}
Uwaga
Te bloki dotyczą wszystkich funkcji, a nie tylko funkcji korzystających z atrybutu CmdletBinding
.
begin
Ten blok służy do zapewnienia opcjonalnego jednorazowego przetwarzania wstępnego dla funkcji. Środowisko uruchomieniowe programu PowerShell używa kodu w tym bloku raz dla każdego wystąpienia funkcji w potoku.
process
Ten blok służy do udostępniania przetwarzania rekordów według rekordów dla funkcji. Blok można używać process
bez definiowania innych bloków. process
Liczba wykonań bloków zależy od sposobu używania funkcji i danych wejściowych odbieranych przez funkcję.
Zmienna $_
automatyczna lub $PSItem
zawiera bieżący obiekt w potoku do użycia w process
bloku. Zmienna automatyczna $input
zawiera moduł wyliczający dostępny tylko dla funkcji i bloków skryptów.
Aby uzyskać więcej informacji, zobacz about_Automatic_Variables.
- Wywołanie funkcji na początku lub poza potokiem wykonuje
process
blok raz. - W potoku
process
blok jest wykonywany raz dla każdego obiektu wejściowego, który dociera do funkcji. - Jeśli dane wejściowe potoku docierające do funkcji są puste,
process
blok nie jest wykonywany.- Bloki
begin
,end
iclean
nadal są wykonywane.
- Bloki
Ważne
Jeśli parametr funkcji jest ustawiony na akceptowanie danych wejściowych potoku, a process
blok nie jest zdefiniowany, przetwarzanie rekordu po rekordzie zakończy się niepowodzeniem. W takim przypadku funkcja będzie wykonywana tylko raz, niezależnie od danych wejściowych.
Podczas tworzenia funkcji, która akceptuje dane wejściowe potoku i używa CmdletBinding
metody , process
blok powinien używać zmiennej parametru zdefiniowanej dla danych wejściowych potoku $_
zamiast lub $PSItem
. Na przykład:
function Get-SumOfNumbers {
[CmdletBinding()]
param (
[Parameter(Mandatory, Position=0, ValueFromPipeline)]
[int[]]$Numbers
)
begin { $retValue = 0 }
process {
foreach ($n in $Numbers) {
$retValue += $n
}
}
end { $retValue }
}
PS> Get-SumOfNumbers 1,2,3,4
10
PS> 1,2,3,4 | Get-SumOfNumbers
10
end
Ten blok służy do udostępniania opcjonalnego jednorazowego przetwarzania końcowego dla funkcji.
clean
Blok clean
został dodany w programie PowerShell 7.3.
Blok clean
jest wygodnym sposobem czyszczenia zasobów obejmujących begin
bloki , i end
. process
Jest to semantycznie podobne do finally
bloku, który obejmuje wszystkie inne nazwane bloki funkcji skryptu lub polecenia cmdlet skryptu. Czyszczenie zasobów jest wymuszane w następujących scenariuszach:
- gdy wykonywanie potoku kończy się normalnie bez przerywania błędu
- gdy wykonywanie potoku zostanie przerwane z powodu błędu zakończenia
- gdy potok zostanie zatrzymany przez
Select-Object -First
- gdy potok jest zatrzymywany za pomocą klawiszy Ctrl+c lub
StopProcessing()
Blok czysty odrzuca wszystkie dane wyjściowe zapisane w strumieniu Powodzenie .
Uwaga
clean
Dodanie bloku to zmiana powodująca niezgodność. Ponieważ clean
jest analizowany jako słowo kluczowe, uniemożliwia użytkownikom bezpośrednie wywoływanie polecenia o nazwie clean
jako pierwszej instrukcji w bloku skryptu. Jednak prawdopodobnie nie będzie to problem. Nadal można wywołać polecenie przy użyciu operatora wywołania (& clean
).
Metody potwierdzenia
ShouldProcess
Ta metoda jest wywoływana w celu żądania potwierdzenia od użytkownika, zanim funkcja wykona akcję, która spowoduje zmianę systemu. Funkcja może kontynuować na podstawie wartości logicznej zwracanej przez metodę . Tę metodę można wywołać tylko z bloku Process{}
funkcji. Atrybut CmdletBinding
musi również zadeklarować, że funkcja obsługuje ShouldProcess
(jak pokazano w poprzednim przykładzie).
Aby uzyskać więcej informacji na temat tej metody, zobacz System.Management.Automation.Cmdlet.ShouldProcess.
Aby uzyskać więcej informacji na temat żądania potwierdzenia, zobacz Żądanie potwierdzenia.
ShouldContinue
Ta metoda jest wywoływana w celu żądania drugiego komunikatu potwierdzenia. Powinna być wywoływana, ShouldProcess
gdy metoda zwraca $true
wartość . Aby uzyskać więcej informacji na temat tej metody, zobacz System.Management.Automation.Cmdlet.ShouldContinue.
Metody błędów
Funkcje mogą wywoływać dwie różne metody w przypadku wystąpienia błędów. W przypadku wystąpienia błędu, który nie kończy się, funkcja powinna wywołać metodę opisaną WriteError
w Write
sekcji metody. Gdy wystąpi błąd zakończenia i funkcja nie może kontynuować, powinna wywołać metodę ThrowTerminatingError
. Można również użyć instrukcji Throw
do kończenie błędów i polecenia cmdlet Write-Error w przypadku błędów niepowodujących zakończenia.
Aby uzyskać więcej informacji, zobacz System.Management.Automation.Cmdlet.ThrowTerminatingError.
Metody zapisu
Funkcja może wywołać następujące metody, aby zwrócić różne typy danych wyjściowych.
Zwróć uwagę, że nie wszystkie dane wyjściowe przechodzą do następnego polecenia w potoku. Możesz również użyć różnych Write
poleceń cmdlet, takich jak Write-Error
.
WriteCommandDetail
Aby uzyskać informacje o metodzie WriteCommandDetails
, zobacz System.Management.Automation.Cmdlet.WriteCommandDetail.
WriteDebug
Aby podać informacje, które mogą służyć do rozwiązywania problemów z funkcją, należy wywołać metodę WriteDebug
. Metoda WriteDebug
wyświetla komunikaty debugowania dla użytkownika. Aby uzyskać więcej informacji, zobacz System.Management.Automation.Cmdlet.WriteDebug.
WriteError
Funkcje powinny wywoływać tę metodę, gdy wystąpią błędy niepowodujące zakończenia, a funkcja została zaprojektowana tak, aby kontynuować przetwarzanie rekordów. Aby uzyskać więcej informacji, zobacz System.Management.Automation.Cmdlet.WriteError.
Uwaga
Jeśli wystąpi błąd zakończenia, funkcja powinna wywołać metodę ThrowTerminatingError .
Writeobject
Metoda WriteObject
umożliwia funkcji wysyłanie obiektu do następnego polecenia w potoku. W większości przypadków jest to metoda używana, WriteObject
gdy funkcja zwraca dane. Aby uzyskać więcej informacji, zobacz System.Management.Automation.PSCmdlet.WriteObject.
WriteProgress
W przypadku funkcji z akcjami, które trwają długo, ta metoda umożliwia funkcji wywoływanie WriteProgress
metody tak, aby wyświetlane informacje o postępie. Na przykład można wyświetlić procent ukończony.
Aby uzyskać więcej informacji, zobacz System.Management.Automation.PSCmdlet.WriteProgress.
WriteVerbose
Aby podać szczegółowe informacje o tym, co robi funkcja, należy wywołać metodę WriteVerbose
w celu wyświetlenia pełnych komunikatów dla użytkownika. Domyślnie pełne komunikaty nie są wyświetlane. Aby uzyskać więcej informacji, zobacz System.Management.Automation.PSCmdlet.WriteVerbose.
WriteWarning
Aby podać informacje o warunkach, które mogą powodować nieoczekiwane wyniki, należy wywołać metodę WriteWarning, aby wyświetlić użytkownikowi komunikaty ostrzegawcze. Domyślnie są wyświetlane komunikaty ostrzegawcze. Aby uzyskać więcej informacji, zobacz System.Management.Automation.PSCmdlet.WriteWarning.
Uwaga
Komunikaty ostrzegawcze można również wyświetlić, konfigurując zmienną $WarningPreference
lub przy użyciu Verbose
opcji wiersza polecenia i Debug
. Aby uzyskać więcej informacji na temat zmiennej $WarningPreference
, zobacz about_Preference_Variables.
Inne metody i właściwości
Aby uzyskać informacje o innych metodach i właściwościach, do których można uzyskać dostęp za pośrednictwem zmiennej $PSCmdlet
, zobacz System.Management.Automation.PSCmdlet.
Na przykład właściwość ParameterSetName umożliwia wyświetlenie używanego zestawu parametrów. Zestawy parametrów umożliwiają utworzenie funkcji wykonującej różne zadania na podstawie parametrów określonych podczas uruchamiania funkcji.