Acerca de los depuradores
DESCRIPCIÓN BREVE
Describe el depurador de PowerShell.
DESCRIPCIÓN LARGA
La depuración es el proceso de examinar un script mientras se ejecuta para identificar y corregir errores en las instrucciones del script. El depurador de PowerShell puede ayudarle a examinar e identificar errores e ineficiencias en los scripts, funciones, comandos, flujos de trabajo de PowerShell, configuraciones o expresiones de PowerShell Desired State Configuration (DSC).
A partir de PowerShell 5.0, el depurador de PowerShell se ha actualizado para depurar scripts, funciones, flujos de trabajo, comandos, configuraciones o expresiones que se ejecutan en la consola o Windows PowerShell ISE en equipos remotos. Puede ejecutar Enter-PSSession
para iniciar una sesión interactiva de PowerShell remota en la que puede establecer puntos de interrupción y depurar archivos de script y comandos en el equipo remoto. Enter-PSSession
se ha actualizado la funcionalidad para permitirle volver a conectarse y escribir una sesión desconectada que ejecuta un script o un comando en un equipo remoto. Si el script en ejecución alcanza un punto de interrupción, la sesión de cliente inicia automáticamente el depurador. Si la sesión desconectada que ejecuta un script ya ha alcanzado un punto de interrupción y se detiene en el punto de interrupción, Enter-PSSession
inicia automáticamente el depurador de línea de comandos, después de volver a conectarse a la sesión.
El depurador de PowerShell también se puede usar para depurar flujos de trabajo de PowerShell, en la consola de PowerShell o en Windows PowerShell ISE. A partir de PowerShell 5.0, puede depurar dentro de trabajos o procesos en ejecución, ya sea de forma local o remota.
Puede usar las características del depurador de PowerShell para examinar un script de PowerShell, una función, un comando, un flujo de trabajo o una expresión mientras se ejecuta. El depurador de PowerShell incluye un conjunto de cmdlets que permiten establecer puntos de interrupción, administrar puntos de interrupción y ver la pila de llamadas.
Cmdlets del depurador
El depurador de PowerShell incluye el siguiente conjunto de cmdlets:
Set-PSBreakpoint
: establece puntos de interrupción en líneas, variables y comandos.Get-PSBreakpoint
: obtiene puntos de interrupción en la sesión actual.Disable-PSBreakpoint
: desactiva los puntos de interrupción en la sesión actual.Enable-PSBreakpoint
: vuelve a habilitar los puntos de interrupción en la sesión actual.Remove-PSBreakpoint
: elimina puntos de interrupción de la sesión actual.Get-PSCallStack
: muestra la pila de llamadas actual.
Iniciar y detener el depurador
Para iniciar el depurador, establezca uno o varios puntos de interrupción. A continuación, ejecute el script, el comando o la función que desea depurar.
Cuando se alcanza un punto de interrupción, la ejecución se detiene y el control se vuelve al depurador.
Para detener el depurador, ejecute el script, el comando o la función hasta que se complete. O bien, escriba stop
o t
.
Comandos del depurador
Cuando use el depurador en la consola de PowerShell, use los siguientes comandos para controlar la ejecución. En Windows PowerShell ISE, use comandos en el menú Depurar.
Nota: Para obtener información sobre cómo usar el depurador en otras aplicaciones host, consulte la documentación de la aplicación host.
s
,StepInto
: ejecuta la siguiente instrucción y, a continuación, se detiene.v
,StepOver
: ejecuta la instrucción siguiente, pero omite las funciones e invocaciones. Las instrucciones omitidas se ejecutan, pero no se depuran paso a paso.Ctrl+Break
: (Interrumpir todo en ISE) Se divide en un script en ejecución dentro de la consola de PowerShell o Windows PowerShell ISE. Tenga en cuenta que Ctrl+Interrumpir en Windows PowerShell 2.0, 3.0 y 4.0 cierra el programa. Break All funciona en scripts locales y remotos en ejecución interactiva.o
,StepOut
: realiza pasos fuera de la función actual; subir un nivel si está anidado. Si está en el cuerpo principal, continúa hasta el final o el siguiente punto de interrupción. Las instrucciones omitidas se ejecutan, pero no se depuran paso a paso.c
,Continue
: continúa ejecutándose hasta que se complete el script o hasta que se alcance el siguiente punto de interrupción. Las instrucciones omitidas se ejecutan, pero no se depuran paso a paso.l
,List
: muestra la parte del script que se está ejecutando. De forma predeterminada, muestra la línea actual, cinco líneas anteriores y 10 líneas posteriores. Para continuar enumerando el script, presione ENTRAR.l <m>
,List
: muestra 16 líneas del script que comienzan por el número de línea especificado por<m>
.l <m> <n>
,List
: muestra<n>
las líneas del script, empezando por el número de línea especificado por<m>
.q
,Stop
,Exit
: deja de ejecutar el script y sale del depurador. Si está depurando un trabajo mediante la ejecución delDebug-Job
cmdlet , elExit
comando desasocia el depurador y permite que el trabajo continúe ejecutándose.k
,Get-PsCallStack
: muestra la pila de llamadas actual.<Enter>
: repite el último comando si era Paso (s), StepOver (v) o List (l). De lo contrario, representa una acción de envío.?
,h
: muestra la Ayuda del comando del depurador.
Para salir del depurador, puede usar Stop (q).
A partir de PowerShell 5.0, puede ejecutar el comando Exit para salir de una sesión de depuración anidada que inició ejecutando Debug-Job
o Debug-Runspace
.
Mediante el uso de estos comandos del depurador, puede ejecutar un script, detenerlo en un punto de preocupación, examinar los valores de las variables y el estado del sistema y continuar ejecutando el script hasta que haya identificado un problema.
NOTA: Si entra en una instrucción con un operador de redireccionamiento, como ">", el depurador de PowerShell realiza los pasos de todas las instrucciones restantes del script.
Mostrar los valores de las variables de script
Mientras se encuentra en el depurador, también puede escribir comandos, mostrar el valor de las variables, usar cmdlets y ejecutar scripts en la línea de comandos.
Puede mostrar el valor actual de todas las variables del script que se está depurando, excepto las siguientes variables automáticas:
$_
$Args
$Input
$MyInvocation
$PSBoundParameters
Si intenta mostrar el valor de cualquiera de estas variables, obtendrá el valor de esa variable en una canalización interna usada por el depurador, no el valor de la variable en el script.
Para mostrar el valor de estas variables para el script que se está depurando, en el script, asigne el valor de la variable automática a una nueva variable. A continuación, puede mostrar el valor de la nueva variable.
Por ejemplo,
$scriptArgs = $Args
$scriptArgs
En el ejemplo de este tema, el valor de la $MyInvocation
variable se reasigna de la siguiente manera:
$scriptname = $MyInvocation.MyCommand.Path
Entorno del depurador
Cuando llegue a un punto de interrupción, escriba el entorno del depurador. El símbolo del sistema cambia para que comience por "[DBG]:". Si está depurando un flujo de trabajo, el mensaje es "[WFDBG]". Puede personalizar el mensaje.
Para obtener más información sobre cómo personalizar el mensaje, consulte about_Prompts.
Además, en algunas aplicaciones host, como la consola de PowerShell, (pero no en Windows PowerShell entorno de scripting integrado [ISE]), se abre una solicitud anidada para la depuración. Puede detectar el símbolo del sistema anidado si repite caracteres mayores que (ASCII 62) que aparecen en el símbolo del sistema.
Por ejemplo, lo siguiente es la solicitud de depuración predeterminada en la consola de PowerShell:
[DBG]: PS (get-location)>>>
Puede encontrar el nivel de anidamiento mediante la $NestedPromptLevel
variable automática.
Además, una variable automática, $PSDebugContext
, se define en el ámbito local. Puede usar la presencia de la $PsDebugContext
variable para determinar si se encuentra en el depurador.
Por ejemplo:
if ($PSDebugContext) {"Debugging"} else {"Not Debugging"}
Puede usar el valor de la variable en la $PSDebugContext
depuración.
[DBG]: PS>>> $PSDebugContext.InvocationInfo
Name CommandLineParameters UnboundArguments Location
---- --------------------- ---------------- --------
= {} {} C:\ps-test\vote.ps1 (1)
Depuración y ámbito
La separación en el depurador no cambia el ámbito en el que se está trabajando, pero cuando se llega a un punto de interrupción en un script, se mueve al ámbito del script. El ámbito del script es un elemento secundario del ámbito en el que ejecutó el depurador.
Para buscar las variables y alias que se definen en el ámbito de script, use el parámetro Scope de los Get-Alias
cmdlets o Get-Variable
.
Por ejemplo, el siguiente comando obtiene las variables en el ámbito local (script):
Get-Variable -scope 0
Puede abreviar el comando como:
gv -s 0
Se trata de una manera útil de ver solo las variables que definió en el script y que definió durante la depuración.
Depuración en la línea de comandos
Al establecer un punto de interrupción variable o un punto de interrupción de comando, puede establecer el punto de interrupción solo en un archivo de script. Sin embargo, de forma predeterminada, el punto de interrupción se establece en cualquier elemento que se ejecute en la sesión actual.
Por ejemplo, si establece un punto de interrupción en la $name
variable, el depurador se interrumpe en cualquier $name
variable de cualquier script, comando, función, cmdlet de script o expresión que ejecute hasta que deshabilite o quite el punto de interrupción.
Esto le permite depurar los scripts en un contexto más realista en el que podrían verse afectados por funciones, variables y otros scripts en la sesión y en el perfil del usuario.
Los puntos de interrupción de línea son específicos de los archivos de script, por lo que solo se establecen en archivos de script.
Depurar flujos de trabajo
El depurador de PowerShell 4.0 se puede usar para depurar flujos de trabajo de PowerShell, ya sea en la consola de PowerShell o en Windows PowerShell ISE. Hay algunas limitaciones con el uso del depurador de PowerShell para depurar flujos de trabajo.
- Puede ver las variables de flujo de trabajo mientras se encuentra en el depurador, pero no se admite la configuración de variables de flujo de trabajo desde el depurador.
- Finalización con tabulación cuando se detiene en el depurador de flujo de trabajo no está disponible.
- La depuración de flujos de trabajo solo funciona con la ejecución sincrónica de flujos de trabajo desde un script de PowerShell. No se pueden depurar flujos de trabajo si se ejecutan como un trabajo (con el parámetro AsJob ).
- Otros escenarios de depuración anidados, como un flujo de trabajo que llama a otro flujo de trabajo o un flujo de trabajo que llama a un script, no se implementan.
En el ejemplo siguiente se muestra cómo depurar un flujo de trabajo. Cuando el depurador pasa a la función de flujo de trabajo, el mensaje del depurador cambia a "[WFDBG]".
PS C:> Set-PSBreakpoint -Script C:\TestWFDemo1.ps1 -Line 8
ID Script Line Command Variable Action
-- ------ ---- ------- -------- ------
0 TestWFDemo1.ps1 8
PS C:> C:\TestWFDemo1.ps1
Entering debug mode. Use h or ? for help.
Hit Line breakpoint on 'C:\TestWFDemo1.ps1:8'
At C:\TestWFDemo1.ps1:8 char:5
+ Write-Output -InputObject "Now writing output:"
# +!INCLUDE[]~~~~~
[WFDBG:localhost]: PS C:>> list
# 3:
4: workflow SampleWorkflowTest
5: {
6: param ($MyOutput)
# 7:
8:* Write-Output -InputObject "Now writing output:"
9: Write-Output -Input $MyOutput
# 10:
11: Write-Output -InputObject "Get PowerShell process:"
12: Get-Process -Name powershell
# 13:
14: Write-Output -InputObject "Workflow function complete."
15: }
# 16:
17: # Call workflow function
18: SampleWorkflowTest -MyOutput "Hello"
[WFDBG:localhost]: PS C:>> $MyOutput
Hello
[WFDBG:localhost]: PS C:>> stepOver
Now writing output:
At C:\TestWFDemo1.ps1:9 char:5
+ Write-Output -Input $MyOutput
# +!INCLUDE[]~
[WFDBG:localhost]: PS C:>> list
4: workflow SampleWorkflowTest
5: {
6: param ($MyOutput)
# 7:
8: Write-Output -InputObject "Now writing output:"
9:* Write-Output -Input $MyOutput
# 10:
11: Write-Output -InputObject "Get PowerShell process:"
12: Get-Process -Name powershell
# 13:
14: Write-Output -InputObject "Workflow function complete."
15: }
# 16:
17: # Call workflow function
18: SampleWorkflowTest -MyOutput "Hello"
# 19:
[WFDBG:localhost]: PS C:>> stepOver
Hello
At C:\TestWFDemo1.ps1:11 char:5
+ Write-Output -InputObject "Get PowerShell process:"
# +!INCLUDE[]~~~~~~~~~
[WFDBG:localhost]: PS C:>> stepOut
Get PowerShell process:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
433 35 106688 128392 726 2.67 7124 powershell
499 44 134244 172096 787 2.79 7452 powershell
Workflow function complete.
Funciones de depuración
Cuando se establece un punto de interrupción en una función que tiene Begin
secciones , Process
y End
, el depurador se interrumpe en la primera línea de cada sección.
Por ejemplo:
function test-cmdlet {
begin {
write-output "Begin"
}
process {
write-output "Process"
}
end {
write-output "End"
}
}
C:\PS> Set-PSBreakpoint -command test-cmdlet
C:\PS> test-cmdlet
Begin
Entering debug mode. Use h or ? for help.
Hit Command breakpoint on 'prompt:test-cmdlet'
test-cmdlet
[DBG]: C:\PS> c
Process
Entering debug mode. Use h or ? for help.
Hit Command breakpoint on 'prompt:test-cmdlet'
test-cmdlet
[DBG]: C:\PS> c
End
Entering debug mode. Use h or ? for help.
Hit Command breakpoint on 'prompt:test-cmdlet'
test-cmdlet
# [DBG]: C:\PS>
Depuración de scripts remotos
A partir de PowerShell 5.0, puede ejecutar el depurador de PowerShell en una sesión remota, en la consola o Windows PowerShell ISE.
Enter-PSSession
se ha actualizado la funcionalidad para permitirle volver a conectarse a una sesión desconectada que se ejecuta en un equipo remoto y ejecutar actualmente un script. Si el script en ejecución alcanza un punto de interrupción, la sesión de cliente inicia automáticamente el depurador.
A continuación se muestra un ejemplo que muestra cómo funciona esto, con puntos de interrupción establecidos en un script en las líneas 6, 11, 22 y 25. Tenga en cuenta que, en el ejemplo, cuando se inicia el depurador, hay dos avisos de identificación: el nombre del equipo en el que se ejecuta la sesión y el símbolo del sistema dbg que le permite saber que está en modo de depuración.
Enter-Pssession -Cn localhost
[localhost]: PS C:\psscripts> Set-PSBreakpoint .\ttest19.ps1 6,11,22,25
ID Script Line Command Variable Action
-- ------ ---- ------- -------- ------
0 ttest19.ps1 6
1 ttest19.ps1 11
2 ttest19.ps1 22
3 ttest19.ps1 25
[localhost]: PS C:\psscripts> .\ttest19.ps1
Hit Line breakpoint on 'C:\psscripts\ttest19.ps1:11'
At C:\psscripts\ttest19.ps1:11 char:1
+ $winRMName = "WinRM"
# + ~
[localhost]: [DBG]: PS C:\psscripts>> list
6: 1..5 | foreach { sleep 1; Write-Output "hello2day $_" }
7: }
# 8:
9: $count = 10
10: $psName = "PowerShell"
11:* $winRMName = "WinRM"
12: $myVar = 102
# 13:
14: for ($i=0; $i -lt $count; $i++)
15: {
16: sleep 1
17: Write-Output "Loop iteration is: $i"
18: Write-Output "MyVar is $myVar"
# 19:
20: hello2day
# 21:
[localhost]: [DBG]: PS C:\psscripts>> stepover
At C:\psscripts\ttest19.ps1:12 char:1
+ $myVar = 102
# + ~
[localhost]: [DBG]: PS C:\psscripts>> quit
[localhost]: PS C:\psscripts> Exit-PSSession
PS C:\psscripts>
Ejemplos
Este script de prueba detecta la versión del sistema operativo y muestra un mensaje adecuado para el sistema. Incluye una función, una llamada de función y una variable.
El comando siguiente muestra el contenido del archivo de script de prueba:
PS C:\PS-test> Get-Content test.ps1
function psversion {
"PowerShell " + $PSVersionTable.PSVersion
if ($PSVersionTable.PSVersion.Major -lt 6) {
"Upgrade to PowerShell 6.0!"
}
else {
"Have you run a background job today (start-job)?"
}
}
$scriptName = $MyInvocation.MyCommand.Path
psversion
"Done $scriptName."
Para empezar, establezca un punto de interrupción en un punto de interés en el script, como una línea, un comando, una variable o una función.
Empiece por crear un punto de interrupción de línea en la primera línea del script Test.ps1 en el directorio actual.
PS C:\ps-test> Set-PSBreakpoint -line 1 -script test.ps1
Este comando se puede abreviar como:
PS C:\ps-test> spb 1 -s test.ps1
El comando devuelve un objeto de punto de interrupción de línea (System.Management.Automation.LineBreakpoint).
Column : 0
Line : 1
Action :
Enabled : True
HitCount : 0
Id : 0
Script : C:\ps-test\test.ps1
ScriptName : C:\ps-test\test.ps1
Ahora, inicie el script.
PS C:\ps-test> .\test.ps1
Cuando el script alcanza el primer punto de interrupción, el mensaje de punto de interrupción indica que el depurador está activo. Describe el punto de interrupción y muestra una vista previa de la primera línea del script, que es una declaración de función. El símbolo del sistema también cambia para indicar que el depurador tiene control.
La línea de vista previa incluye el nombre del script y el número de línea del comando en vista previa.
Entering debug mode. Use h or ? for help.
Hit Line breakpoint on 'C:\ps-test\test.ps1:1'
test.ps1:1 function psversion {
# DBG>
Use el comando Step (s) para ejecutar la primera instrucción del script y para obtener una vista previa de la siguiente instrucción. La siguiente instrucción usa la $MyInvocation
variable automática para establecer el valor de la $scriptName
variable en la ruta de acceso y el nombre de archivo del archivo de script.
DBG> s
test.ps1:11 $scriptName = $MyInvocation.MyCommand.Path
En este momento, la $scriptName
variable no se rellena, pero puede comprobar el valor de la variable mostrando su valor. En este caso, el valor es $null
.
DBG> $scriptname
# DBG>
Use otro comando Step (s) para ejecutar la instrucción actual y para obtener una vista previa de la siguiente instrucción en el script. La siguiente instrucción llama a la función PsVersion.
DBG> s
test.ps1:12 psversion
En este momento, la $scriptName
variable se rellena, pero se comprueba el valor de la variable mostrando su valor. En este caso, el valor se establece en la ruta de acceso del script.
DBG> $scriptName
C:\ps-test\test.ps1
Use otro comando Step para ejecutar la llamada de función. Presione ENTRAR o escriba "s" en Paso.
DBG> s
test.ps1:2 "PowerShell " + $PSVersionTable.PSVersion
El mensaje de depuración incluye una vista previa de la instrucción en la función . Para ejecutar esta instrucción y para obtener una vista previa de la siguiente instrucción de la función, puede usar un Step
comando . Pero, en este caso, use un comando StepOut (o). Completa la ejecución de la función (a menos que llegue a un punto de interrupción) y los pasos a la siguiente instrucción del script.
DBG> o
Windows PowerShell 2.0
Have you run a background job today (start-job)?
test.ps1:13 "Done $scriptName"
Dado que estamos en la última instrucción del script, los comandos Step, StepOut y Continue tienen el mismo efecto. En este caso, use StepOut (o).
Done C:\ps-test\test.ps1
PS C:\ps-test>
El comando StepOut ejecuta el último comando. El símbolo del sistema estándar indica que el depurador ha salido y devuelto el control al procesador de comandos.
Ahora, vuelva a ejecutar el depurador. En primer lugar, para eliminar el punto de interrupción actual, use los Get-PSBreakpoint
cmdlets y Remove-PSBreakpoint
. (Si cree que podría reutilizar el punto de interrupción, use el Disable-PSBreakpoint
cmdlet en lugar de Remove-PSBreakpoint
.
PS C:\ps-test> Get-PSBreakpoint| Remove-PSBreakpoint
Este comando se puede abreviar como:
PS C:\ps-test> gbp | rbp
O bien, ejecute el comando escribiendo una función, como la siguiente:
function delbr { gbp | rbp }
Ahora, cree un punto de interrupción en la $scriptname
variable .
PS C:\ps-test> Set-PSBreakpoint -variable scriptname -script test.ps1
Puede abreviar el comando como:
PS C:\ps-test> sbp -v scriptname -s test.ps1
Ahora, inicie el script. El script alcanza el punto de interrupción de la variable. El modo predeterminado es Write, por lo que la ejecución se detiene justo antes de la instrucción que cambia el valor de la variable.
PS C:\ps-test> .\test.ps1
Hit Variable breakpoint on 'C:\ps-test\test.ps1:$scriptName'
(Write access)
test.ps1:11 $scriptName = $MyInvocation.MyCommand.Path
# DBG>
Muestra el valor actual de la $scriptName
variable, que es $null
.
DBG> $scriptName
# DBG>
Use un comando Step (s) para ejecutar la instrucción que rellena la variable.
A continuación, muestre el nuevo valor de la $scriptName
variable.
DBG> $scriptName
C:\ps-test\test.ps1
```powershell
Use a Step command (s) to preview the next statement in the script.
```powershell
DBG> s
test.ps1:12 psversion
La siguiente instrucción es una llamada a la función PsVersion. Para omitir la función pero seguir ejecutándola, use un comando StepOver (v). Si ya está en la función cuando usa StepOver, no es eficaz. Se muestra la llamada de función, pero no se ejecuta.
DBG> v
Windows PowerShell 2.0
Have you run a background job today (start-job)?
test.ps1:13 "Done $scriptName"
El comando StepOver ejecuta la función y se muestra una vista previa de la siguiente instrucción en el script, que imprime la línea final.
Use un comando Stop (t) para salir del depurador. El símbolo del sistema se revierte al símbolo del sistema estándar.
C:\ps-test>
Para eliminar los puntos de interrupción, use los Get-PSBreakpoint
cmdlets y Remove-PSBreakpoint
.
PS C:\ps-test> Get-PSBreakpoint| Remove-PSBreakpoint
Create un nuevo punto de interrupción de comando en la función PsVersion.
PS C:\ps-test> Set-PSBreakpoint -command psversion -script test.ps1
Puede abreviar este comando para:
PS C:\ps-test> sbp -c psversion -s test.ps1
Ahora, ejecute el script.
PS C:\ps-test> .\test.ps1
Hit Command breakpoint on 'C:\ps-test\test.ps1:psversion'
test.ps1:12 psversion
# DBG>
El script alcanza el punto de interrupción en la llamada de función. En este momento, aún no se ha llamado a la función . Esto le ofrece la oportunidad de usar el parámetro Action de Set-PSBreakpoint
para establecer condiciones para la ejecución del punto de interrupción o para realizar tareas preparatorias o de diagnóstico, como iniciar un registro o invocar un script de diagnóstico o seguridad.
Para establecer una acción, use un comando Continue (c) para salir del script y un Remove-PSBreakpoint
comando para eliminar el punto de interrupción actual. (Los puntos de interrupción son de solo lectura, por lo que no puede agregar una acción al punto de interrupción actual).
DBG> c
Windows PowerShell 2.0
Have you run a background job today (start-job)?
Done C:\ps-test\test.ps1
PS C:\ps-test> Get-PSBreakpoint| Remove-PSBreakpoint
PS C:\ps-test>
Ahora, cree un nuevo punto de interrupción de comando con una acción. El siguiente comando establece un punto de interrupción de comando con una acción que registra el valor de la $scriptName
variable cuando se llama a la función . Dado que la palabra clave Break no se usa en la acción, la ejecución no se detiene. (El verso (') es el carácter de continuación de línea).
PS C:\ps-test> Set-PSBreakpoint -command psversion -script test.ps1 `
-action { add-content "The value of `$scriptName is $scriptName." `
-path action.log}
También puede agregar acciones que establezcan condiciones para el punto de interrupción. En el comando siguiente, el punto de interrupción del comando solo se ejecuta si la directiva de ejecución está establecida en RemoteSigned, la directiva más restrictiva que todavía le permite ejecutar scripts. (El verso (') es el carácter de continuación).
PS C:\ps-test> Set-PSBreakpoint -script test.ps1 -command psversion `
-action { if ((Get-ExecutionPolicy) -eq "RemoteSigned") { break }}
La palabra clave Break de la acción dirige al depurador para ejecutar el punto de interrupción. También puede usar la palabra clave Continue para dirigir al depurador para que se ejecute sin interrumpir. Dado que la palabra clave predeterminada es Continue, debe especificar Break para detener la ejecución.
Ahora, ejecute el script.
PS C:\ps-test> .\test.ps1
Hit Command breakpoint on 'C:\ps-test\test.ps1:psversion'
test.ps1:12 psversion
Dado que la directiva de ejecución se establece en RemoteSigned, la ejecución se detiene en la llamada de función.
En este momento, es posible que quiera comprobar la pila de llamadas. Use el Get-PsCallStack
cmdlet o el comando del Get-PsCallStack
depurador (k). El siguiente comando obtiene la pila de llamadas actual.
DBG> k
2: prompt
1: .\test.ps1: $args=[]
0: prompt: $args=[]
En este ejemplo se muestran solo algunas de las muchas maneras de usar el depurador de PowerShell.
Para obtener más información sobre los cmdlets del depurador, escriba el siguiente comando:
help <cmdlet-name> -full
Por ejemplo, escriba:
help Set-PSBreakpoint -full
Otras características de depuración en PowerShell
Además del depurador de PowerShell, PowerShell incluye otras características que puede usar para depurar scripts y funciones.
Windows PowerShell ISE incluye un depurador gráfico interactivo. Para obtener más información, inicie Windows PowerShell ISE y presione F1.
El
Set-PSDebug
cmdlet ofrece características de depuración de scripts muy básicas, como la ejecución paso a paso y el seguimiento.Use el
Set-StrictMode
cmdlet para detectar referencias a variables no inicializadas, a referencias a propiedades inexistentes de un objeto y a la sintaxis de función que no es válida.Agregue instrucciones de diagnóstico a un script, como instrucciones que muestran el valor de las variables, las instrucciones que leen la entrada de la línea de comandos o las instrucciones que informan de la instrucción actual. Use los cmdlets que contienen el verbo Write para esta tarea, como
Write-Host
,Write-Debug
,Write-Warning
yWrite-Verbose
.