Jak debugować skrypty w środowisku Windows PowerShell ISE
W tym artykule opisano sposób debugowania skryptów na komputerze lokalnym przy użyciu funkcji debugowania wizualnego zintegrowanego środowiska skryptów programu Windows PowerShell (ISE).
Jak zarządzać punktami przerwania
Punkt przerwania jest wyznaczonym miejscem w skrycie, w którym chcesz wstrzymać operację, aby umożliwić sprawdzenie bieżącego stanu zmiennych i środowiska, w którym jest uruchomiony skrypt. Po wstrzymaniu skryptu przez punkt przerwania możesz uruchomić polecenia w okienku konsoli, aby sprawdzić stan skryptu. Możesz wyświetlać zmienne wyjściowe lub uruchamiać inne polecenia. Można nawet zmodyfikować wartość dowolnych zmiennych widocznych w kontekście aktualnie uruchomionego skryptu. Po zbadaniu tego, co chcesz zobaczyć, możesz wznowić działanie skryptu.
W środowisku debugowania programu Windows PowerShell można ustawić trzy typy punktów przerwania:
Punkt przerwania wiersza. Skrypt wstrzymuje się po osiągnięciu wyznaczonego wiersza podczas działania skryptu
Zmienny punkt przerwania. Skrypt jest wstrzymywane za każdym razem, gdy wartość wyznaczonej zmiennej ulegnie zmianie.
Punkt przerwania polecenia. Skrypt jest wstrzymywane za każdym razem, gdy wyznaczone polecenie ma zostać uruchomione podczas działania skryptu. Może zawierać parametry umożliwiające dalsze filtrowanie punktu przerwania tylko do żądanej operacji. Polecenie może być również utworzoną funkcją.
Z nich w środowisku debugowania środowiska Windows PowerShell ISE można ustawić tylko punkty przerwania wiersza za pomocą menu lub skrótów klawiaturowych. Pozostałe dwa typy punktów przerwania można ustawić, ale są ustawione w okienku konsoli przy użyciu polecenia cmdlet Set-PSBreakpoint . W tej sekcji opisano, jak można wykonywać zadania debugowania w środowisku Windows PowerShell ISE przy użyciu menu, gdzie są dostępne, i wykonywać szerszy zakres poleceń z okienka konsoli przy użyciu skryptów.
Aby ustawić punkt przerwania
Punkt przerwania można ustawić w skrycie dopiero po jego zapisaniu. Kliknij prawym przyciskiem myszy wiersz, w którym chcesz ustawić punkt przerwania wiersza, a następnie kliknij polecenie Przełącz punkt przerwania. Możesz też kliknąć wiersz, w którym chcesz ustawić punkt przerwania wiersza, a następnie naciśnij klawisz F9 lub w menu Debuguj kliknij pozycję Przełącz punkt przerwania.
Poniższy skrypt jest przykładem sposobu ustawiania zmiennego punktu przerwania z okienka konsoli przy użyciu polecenia cmdlet Set-PSBreakpoint .
# This command sets a breakpoint on the Server variable in the Sample.ps1 script.
Set-PSBreakpoint -Script sample.ps1 -Variable Server
Wyświetlanie listy wszystkich punktów przerwania
Wyświetla wszystkie punkty przerwania w bieżącej sesji programu Windows PowerShell.
W menu Debugowanie kliknij pozycję Punkty przerwania listy. Poniższy skrypt to przykład sposobu wyświetlania listy wszystkich punktów przerwania w okienku konsoli przy użyciu polecenia cmdlet Get-PSBreakpoint .
# This command lists all breakpoints in the current session.
Get-PSBreakpoint
Usuwanie punktu przerwania
Usunięcie punktu przerwania powoduje usunięcie go.
Jeśli uważasz, że warto użyć go ponownie później, rozważ wyłączenie punktu przerwania. Kliknij prawym przyciskiem myszy wiersz, w którym chcesz usunąć punkt przerwania, a następnie kliknij pozycję ToggleBreakpoint. Możesz też kliknąć wiersz, w którym chcesz usunąć punkt przerwania, a następnie w menu Debugowanie kliknij pozycję Przełącz punkt przerwania. Poniższy skrypt to przykład usuwania punktu przerwania z określonym identyfikatorem z okienka konsoli przy użyciu polecenia cmdlet Remove-PSBreakpoint .
# This command deletes the breakpoint with breakpoint ID 2.
Remove-PSBreakpoint -Id 2
Usuń wszystkie punkty przerwania
Aby usunąć wszystkie punkty przerwania zdefiniowane w bieżącej sesji, w menu Debugowanie kliknij pozycję Usuń wszystkie punkty przerwania.
Poniższy skrypt to przykład usuwania wszystkich punktów przerwania z okienka konsoli przy użyciu polecenia cmdlet Remove-PSBreakpoint .
# This command deletes all of the breakpoints in the current session.
Get-PSBreakpoint | Remove-PSBreakpoint
Wyłączanie punktu przerwania
Wyłączenie punktu przerwania nie powoduje jego usunięcia. Wyłącza ją do momentu włączenia. Aby wyłączyć określony punkt przerwania wiersza, kliknij prawym przyciskiem myszy wiersz, w którym chcesz wyłączyć punkt przerwania, a następnie kliknij polecenie Wyłącz punkt przerwania.
Możesz też kliknąć wiersz, w którym chcesz wyłączyć punkt przerwania, a następnie naciśnij klawisz F9 lub w menu Debuguj kliknij pozycję Wyłącz punkt przerwania. Poniższy skrypt jest przykładem sposobu usuwania punktu przerwania z określonym identyfikatorem z okienka konsoli przy użyciu polecenia cmdlet Disable-PSBreakpoint .
# This command disables the breakpoint with breakpoint ID 0.
Disable-PSBreakpoint -Id 0
Wyłącz wszystkie punkty przerwania
Wyłączenie punktu przerwania nie powoduje jego usunięcia; wyłącza ją do momentu włączenia. Aby wyłączyć wszystkie punkty przerwania w bieżącej sesji, w menu Debugowanie kliknij pozycję Wyłącz wszystkie punkty przerwania. Poniższy skrypt to przykład wyłączania wszystkich punktów przerwania w okienku konsoli przy użyciu polecenia cmdlet Disable-PSBreakpoint .
# This command disables all breakpoints in the current session.
# You can abbreviate this command as: "gbp | dbp".
Get-PSBreakpoint | Disable-PSBreakpoint
Włączanie punktu przerwania
Aby włączyć określony punkt przerwania, kliknij prawym przyciskiem myszy wiersz, w którym chcesz włączyć punkt przerwania, a następnie kliknij przycisk Włącz punkt przerwania. Możesz też kliknąć wiersz, w którym chcesz włączyć punkt przerwania, a następnie naciśnij klawisz F9 lub w menu Debuguj kliknij pozycję Włącz punkt przerwania. Poniższy skrypt to przykład sposobu włączania określonych punktów przerwania w okienku konsoli przy użyciu polecenia cmdlet Enable-PSBreakpoint .
# This command enables breakpoints with breakpoint IDs 0, 1, and 5.
Enable-PSBreakpoint -Id 0, 1, 5
Włącz wszystkie punkty przerwania
Aby włączyć wszystkie punkty przerwania zdefiniowane w bieżącej sesji, w menu Debugowanie kliknij pozycję Włącz wszystkie punkty przerwania. Poniższy skrypt to przykład sposobu włączania wszystkich punktów przerwania w okienku konsoli przy użyciu polecenia cmdlet Enable-PSBreakpoint .
# This command enables all breakpoints in the current session.
# You can abbreviate the command by using their aliases: "gbp | ebp".
Get-PSBreakpoint | Enable-PSBreakpoint
Jak zarządzać sesją debugowania
Przed rozpoczęciem debugowania należy ustawić co najmniej jeden punkt przerwania. Nie można ustawić punktu przerwania, chyba że skrypt, który chcesz debugować, zostanie zapisany. Aby uzyskać wskazówki dotyczące ustawiania punktu przerwania, zobacz Jak zarządzać punktami przerwania lub Set-PSBreakpoint. Po rozpoczęciu debugowania nie można edytować skryptu do momentu zatrzymania debugowania. Skrypt, który ma co najmniej jeden zestaw punktów przerwania, jest automatycznie zapisywany przed jego uruchomieniem.
Aby rozpocząć debugowanie
Naciśnij klawisz F5 lub na pasku narzędzi kliknij ikonę Uruchom skrypt lub w menu Debuguj kliknij pozycję Uruchom/Kontynuuj. Skrypt jest uruchamiany do momentu napotkania pierwszego punktu przerwania. Wstrzymuje tam operację i wyróżnia linię, na której została wstrzymana.
Aby kontynuować debugowanie
Naciśnij klawisz F5 lub na pasku narzędzi kliknij ikonę Uruchom skrypt lub w menu Debuguj kliknij polecenie Uruchom/Kontynuuj lub w okienku konsoli wpiszC
, a następnie naciśnij klawisz ENTER. Spowoduje to kontynuowanie działania skryptu do następnego punktu przerwania lub na końcu skryptu, jeśli nie napotkano dalszych punktów przerwania.
Aby wyświetlić stos wywołań
Stos wywołań wyświetla bieżącą lokalizację uruchamiania w skrycie. Jeśli skrypt jest uruchomiony w funkcji, która została wywołana przez inną funkcję, jest reprezentowana w wyświetlaniu przez dodatkowe wiersze w danych wyjściowych. W dolnej części wiersza jest wyświetlany oryginalny skrypt i wiersz, w którym została wywołana funkcja. Następny wiersz pokazuje, że funkcja i wiersz w nim, w którym mogła zostać wywołana inna funkcja. W górnym wierszu jest wyświetlany bieżący kontekst bieżącego wiersza, w którym ustawiono punkt przerwania.
Podczas wstrzymania, aby wyświetlić bieżący stos wywołań, naciśnij klawisze CTRL+SHIFT+D lub w menu Debuguj kliknij pozycję Wyświetl stos wywołań lub w okienku konsoli wpiszK
, a następnie naciśnij klawisz ENTER.
Aby zatrzymać debugowanie
Naciśnij klawisze SHIFT+F5 lub w menu Debugowanie kliknij pozycję Zatrzymaj debuger lub w okienku konsoli wpiszQ
, a następnie naciśnij klawisz ENTER.
Jak przejść, przejść do i wyjść podczas debugowania
Krok to proces uruchamiania jednej instrukcji naraz. Możesz zatrzymać się w wierszu kodu i sprawdzić wartości zmiennych i stanu systemu. W poniższej tabeli opisano typowe zadania debugowania, takie jak przechodzenie, przechodzenie do i przechodzenie.
Debugowanie zadania | opis | Jak to zrobić w programie PowerShell ISE |
---|---|---|
Przechodzenie do | Wykonuje bieżącą instrukcję, a następnie zatrzymuje się na następnej instrukcji. Jeśli bieżąca instrukcja jest funkcją lub wywołaniem skryptu, debuger wykonuje kroki do tej funkcji lub skryptu, w przeciwnym razie zatrzymuje się w następnej instrukcji. | Naciśnij klawisz F11 lub w menu Debuguj kliknij pozycję Krok do lub w okienku konsoli wpisz S i naciśnij klawisz ENTER. |
Przechodzenie do kroku | Wykonuje bieżącą instrukcję, a następnie zatrzymuje się na następnej instrukcji. Jeśli bieżąca instrukcja jest wywołaniem funkcji lub skryptu, debuger wykonuje całą funkcję lub skrypt i zatrzymuje się na następnej instrukcji po wywołaniu funkcji. | Naciśnij klawisz F10 lub w menu Debuguj kliknij pozycję Krok do kroku lub w okienku konsoli wpisz V i naciśnij klawisz ENTER. |
Wyjście | Wyjedzie z bieżącej funkcji i na jeden poziom, jeśli funkcja jest zagnieżdżona. Jeśli w treści głównej skrypt jest wykonywany na końcu lub do następnego punktu przerwania. Pominięte instrukcje są wykonywane, ale nie są wykonywane. | Naciśnij klawisze SHIFT+F11 lub w menu Debuguj kliknij pozycję Wyjście lub w okienku konsoli wpisz O i naciśnij klawisz ENTER. |
Kontynuuj | Kontynuuje wykonywanie na końcu lub do następnego punktu przerwania. Pominięte funkcje i wywołania są wykonywane, ale nie są wykonywane. | Naciśnij klawisz F5 lub w menu Debuguj kliknij pozycję Uruchom/Kontynuuj lub w okienku konsoli wpisz C i naciśnij klawisz ENTER. |
Jak wyświetlić wartości zmiennych podczas debugowania
Bieżące wartości zmiennych można wyświetlić w skrycie podczas przechodzenia przez kod.
Aby wyświetlić wartości zmiennych standardowych
Użyj jednej z poniższych metod:
W okienku skryptu umieść wskaźnik myszy na zmiennej, aby wyświetlić jej wartość jako poradę narzędzia.
W okienku konsoli wpisz nazwę zmiennej i naciśnij klawisz ENTER.
Wszystkie okienka w środowisku ISE są zawsze w tym samym zakresie. W związku z tym podczas debugowania skryptu polecenia wpisywane w okienku konsoli są uruchamiane w zakresie skryptu. Dzięki temu można użyć okienka konsoli, aby znaleźć wartości zmiennych i funkcji wywołania zdefiniowanych tylko w skry skrycie.
Aby wyświetlić wartości zmiennych automatycznych
Możesz użyć poprzedniej metody, aby wyświetlić wartość prawie wszystkich zmiennych podczas debugowania skryptu. Jednak te metody nie działają dla następujących zmiennych automatycznych.
$_
$Input
$MyInvocation
$PSBoundParameters
$Args
Jeśli spróbujesz wyświetlić wartość dowolnej z tych zmiennych, uzyskasz wartość tej zmiennej w potoku wewnętrznym używanym przez debuger, a nie wartość zmiennej w skrypsie. Można to obejść dla kilku zmiennych ($_
, $Input
, $MyInvocation
, $PSBoundParameters
i $Args
) przy użyciu następującej metody:
W skryscie przypisz wartość zmiennej automatycznej do nowej zmiennej.
Wyświetl wartość nowej zmiennej, umieszczając wskaźnik myszy na nowej zmiennej w okienku skryptu lub wpisując nową zmienną w okienku konsoli.
Aby na przykład wyświetlić wartość $MyInvocation
zmiennej, w skryscie przypisz wartość do nowej zmiennej, takiej jak $scriptName
, a następnie umieść kursor na zmiennej lub wpisz zmienną $scriptName
, aby wyświetlić jej wartość.
# In C:\ps-test\MyScript.ps1
$scriptName = $MyInvocation.PSCommandPath
# In the Console Pane:
.\MyScript.ps1
$scriptName
C:\ps-test\MyScript.ps1