about_Debuggers
Rövid leírás
A PowerShell hibakeresőjének leírása.
Hosszú leírás
A hibakeresés a szkriptek vizsgálatának folyamata, miközben fut a szkript utasításainak hibáinak azonosítása és javítása. A PowerShell hibakeresője segíthet a szkriptek, függvények, parancsok, PowerShell kívánt állapotkonfigurációk vagy kifejezések hibáinak és hatékonysági hibáinak vizsgálatában és azonosításában.
A PowerShell 5.0-tól kezdve a PowerShell-hibakeresőt frissítettük a távoli számítógépeken futó szkriptek, függvények, parancsok, konfigurációk vagy kifejezések hibakeresésére, amelyek a konzolon vagy a Windows PowerShell integrált szkriptelési környezetében (I Standard kiadás) futnak.
Feljegyzés
A Windows PowerShell I Standard kiadás csak a Windows PowerShellt támogatja. A PowerShell 6-os és újabb verzióihoz a Visual Studio Code-ot kell használnia a PowerShell bővítményével. További információ: Hibakeresés a Visual Studio Code-tal.
Hibakereső parancsmagok
A PowerShell-hibakereső a következő parancsmagokat tartalmazza:
Set-PSBreakpoint
: Töréspontokat állít be vonalakon, változókon és parancsokon.Get-PSBreakpoint
: Töréspontokat kap az aktuális munkamenetben.Disable-PSBreakpoint
: Kikapcsolja a töréspontokat az aktuális munkamenetben.Enable-PSBreakpoint
: Újra engedélyezi a töréspontokat az aktuális munkamenetben.Remove-PSBreakpoint
: Törli a töréspontokat az aktuális munkamenetből.Get-PSCallStack
: Az aktuális hívásverem megjelenítése.
A hibakereső indítása és leállítása
A hibakereső elindításához állítson be egy vagy több töréspontot, majd futtassa a hibakereséshez használni kívánt szkriptet, parancsot vagy függvényt.
Amikor eléri a töréspontot, a végrehajtás leáll, és a vezérlő át lesz kapcsolva a hibakeresőre.
A hibakereső leállításához futtassa a szkriptet, a parancsot vagy a függvényt, amíg be nem fejeződik.
Vagy írja be stop
vagy t
.
Hibakereső parancsok
Ha a Hibakeresőt a PowerShell-konzolon használja, az alábbi parancsokkal szabályozhatja a végrehajtást. A Windows PowerShell I Standard kiadás-ban használja a Hibakeresés menü parancsait.
Feljegyzés
A hibakereső más gazdagépalkalmazásokban való használatáról a gazdagépalkalmazás dokumentációjában tájékozódhat.
s
,StepInto
: Végrehajtja a következő utasítást, majd leáll.v
,StepOver
: Végrehajtja a következő utasítást, de kihagyja a függvényeket és a hívásokat. A kihagyott utasítások végrehajtása, de nem léptethető át.Ctrl+Break
: (Az összes megszakítása az I-ben Standard kiadás) A PowerShell-konzolon vagy a Windows PowerShell I Standard kiadás futó szkriptre törik. Vegye figyelembe, hogy + a Windows PowerShell 2.0-s, 3.0-s és 4.0-s billentyűkombinációja bezárja a programot. A Break All helyi és távoli, interaktívan futó szkripteken is működik.o
,StepOut
: Lépés az aktuális függvényből; beágyazás esetén egy szinttel feljebb. Ha a törzsben továbbra is a végéig vagy a következő töréspontig tart. A kihagyott utasítások végrehajtása, de nem léptethető át.c
,Continue
: A szkript befejezéséig vagy a következő töréspont eléréséig fut. A kihagyott utasítások végrehajtása, de nem léptethető át.l
, :List
Megjeleníti a szkript végrehajtó részét. Alapértelmezés szerint az aktuális sort, öt előző sort és 10 további sort jeleníti meg. A szkript listázásának folytatásához nyomja le az ENTER billentyűt.l <m>
, :List
A szkript 16 sorát jeleníti meg a megadott sorszámmal<m>
kezdődően.l <m> <n>
,List
: Megjeleníti<n>
a szkript sorait, kezdve a megadott<m>
sorszámmal.q
, ,Stop
Exit
: Leállítja a szkript végrehajtását, és kilép a hibakeresőből. Ha a parancsmag futtatásávalDebug-Job
hibakeresést végez egy feladaton, aExit
parancs leválasztja a hibakeresőt, és engedélyezi a feladat futtatását.k
, :Get-PsCallStack
Az aktuális hívásverem megjelenítése.<Enter>
: Megismétli az utolsó parancsot, ha az (), (v
) vagyList
(l
) voltStep
.StepOver
s
Ellenkező esetben küldési műveletet jelöl.?
, :h
Megjeleníti a hibakereső parancs súgóját.
A hibakeresőből való kilépéshez használhatja Stop
(q
).
A PowerShell 5.0-tól kezdve a Kilépés parancs futtatásával kiléphet egy beágyazott hibakeresési munkamenetből, amelyet vagy Debug-Job
Debug-Runspace
a .
Ezekkel a hibakereső parancsokkal futtathat egy szkriptet, leállhat egy problémás ponton, megvizsgálhatja a változók értékeit és a rendszer állapotát, és folytathatja a szkript futtatását, amíg nem talált problémát.
Feljegyzés
Ha átirányítási operátorral lép be egy utasításba, például >
a PowerShell hibakeresője a szkriptben lévő összes többi utasításra lép.
Szkriptváltozók értékeinek megjelenítése
Miközben a hibakeresőben van, parancsokat is megadhat, megjelenítheti a változók értékét, parancsmagokat használhat, és szkripteket futtathat a parancssorban. A hibakeresés alatt álló szkriptben az összes változó aktuális értékét megjelenítheti, kivéve az alábbi automatikus változókat:
$_
$Args
$Input
$MyInvocation
$PSBoundParameters
A változók bármelyikének megjelenítésekor a változó értékét egy belső folyamathoz kapja meg, amelyet a hibakereső használ, nem pedig a szkriptben lévő változó értékét.
Ha meg szeretné jeleníteni a hibakeresés alatt álló szkript ezen változóinak értékét, adjon hozzá sorokat a szkripthez, hogy ezeket az értékeket egy új változóba mentse. Állítsa be a töréspontot az új sorok után. Ezután megjelenítheti az új változó értékét.
Például:
$scriptArgs = $Args
$scriptname = $MyInvocation.PSCommandPath
A hibakereső környezet
Amikor eléri a töréspontot, beírja a hibakereső környezetet. A parancssor úgy változik, hogy a következővel kezdődjön: "[DBG]:". Egyes gazdagépalkalmazásokban, például a PowerShell-konzolon is megnyílik egy beágyazott kérés a hibakereséshez. A beágyazott parancssort a parancssorban megjelenő ismétlődő nagyobb karakterek (ASCII 62) segítségével észlelheti.
A parancssor testreszabásával kapcsolatos további információkért lásd : about_Prompts.
A beágyazási szintet az $NestedPromptLevel
automatikus változóval találja meg. Az automatikus változó $PSDebugContext
a helyi hatókörben van definiálva. A változó jelenlétével meghatározhatja $PSDebugContext
, hogy a hibakeresőn belül fut-e.
Példa:
if ($PSDebugContext) {"Debugging"} else {"Not Debugging"}
A hibakeresésben használhatja a $PSDebugContext
változó értékét.
[DBG]: PS>>> $PSDebugContext.InvocationInfo
Name CommandLineParameters UnboundArguments Location
---- --------------------- ---------------- --------
= {} {} C:\ps-test\vote.ps1 (1)
Hibakeresés és hatókör
A hibakeresőbe való betörés nem változtatja meg azt a hatókört, amelyben működik, de amikor egy szkript töréspontjához ér, a szkript hatókörébe lép. A szkript hatóköre annak a hatókörnek a gyermeke, amelyben a hibakeresőt futtatta.
A szkript hatókörében definiált változók és aliasok megkereséséhez használja a Get-Alias
Get-Variable
parancsmagok Hatókör paraméterét.
A következő parancs például lekéri a változókat a helyi (szkript) hatókörben:
Get-Variable -scope 0
Ez hasznos módja annak, hogy csak a szkriptben definiált és a hibakeresés során definiált változókat láthassa.
Hibakeresés a parancssorban
Változó töréspont vagy parancstörési pont beállításakor a töréspontot csak szkriptfájlban állíthatja be. Alapértelmezés szerint azonban a töréspont mindenre be van állítva, amely az aktuális munkamenetben fut.
Ha például töréspontot állít be a $name
változón, a hibakereső megszakítja a $name
töréspont letiltásáig vagy eltávolításáig futtatott szkriptek, parancsok, függvények, szkript parancsmagok vagy kifejezések bármely változóját.
Ez lehetővé teszi a szkriptek hibakeresését egy reálisabb környezetben, amelyben a munkamenetben és a felhasználói profilban lévő függvények, változók és egyéb szkriptek hatással lehetnek rájuk.
A sortörési pontok a szkriptfájlokra vonatkoznak, ezért csak szkriptfájlokban vannak beállítva.
Hibakeresési függvények
Amikor töréspontot állít be egy olyan függvényen, amelynek begin
, process
és end
szakaszai vannak, a hibakereső az egyes szakaszok első sorában törik meg.
Példa:
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>
Távoli szkriptek hibakeresése
Futtathat Enter-PSSession
egy interaktív távoli PowerShell-munkamenetet, amelyben töréspontokat állíthat be, és szkriptfájlokat és parancsokat hibakereséssel végezhet a távoli számítógépen. Enter-PSSession
lehetővé teszi egy távoli számítógépen parancsfájlt vagy parancsot futtató leválasztott munkamenet újracsatlakoztatását. Ha a futó szkript töréspontot ér el, az ügyfél munkamenete automatikusan elindítja a hibakeresőt. Ha a szkriptet futtató leválasztott munkamenet már elérte a töréspontot, Enter-PSSession
automatikusan elindítja a parancssori hibakeresőt, amikor újra csatlakozik a munkamenethez.
Az alábbi példa bemutatja ennek működését. A töréspontok a szkript 6., 11., 22. és 25. sorában lettek beállítva. A hibakereső indításakor a parancssor két azonosító módosítást hajt végre:
- Annak a számítógépnek a neve, amelyen a munkamenet fut
- A hibakeresési módban lévő adatbázis-kezelő üzenet
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>
Példák
Ez a tesztszkript észleli a PowerShell verzióját, és megjeleníti a verziónak megfelelő üzenetet. Tartalmaz egy függvényt, egy függvényhívást és egy változót.
A következő parancs megjeleníti a tesztszkriptfájl tartalmát:
PS C:\PS-test> Get-Content test.ps1
function psversion {
"PowerShell " + $PSVersionTable.PSVersion
if ($PSVersionTable.PSVersion.Major -lt 7) {
"Upgrade to PowerShell 7!"
}
else {
"Have you run a background job today (start-job)?"
}
}
$scriptName = $MyInvocation.PSCommandPath
psversion
"Done $scriptName."
Első lépésként állítson be egy töréspontot a szkript érdeklődési pontjára, például egy sorra, parancsra, változóra vagy függvényre.
Először hozzon létre egy sortörési pontot a Test.ps1 szkript első sorában az aktuális könyvtárban.
PS C:\ps-test> Set-PSBreakpoint -line 1 -script test.ps1
A parancs egy System.Management.Automation.LineBreakpoint objektumot ad vissza.
Column : 0
Line : 1
Action :
Enabled : True
HitCount : 0
Id : 0
Script : C:\ps-test\test.ps1
ScriptName : C:\ps-test\test.ps1
Most indítsa el a szkriptet.
PS C:\ps-test> .\test.ps1
Amikor a szkript eléri az első töréspontot, a töréspont üzenet azt jelzi, hogy a hibakereső aktív. Leírja a töréspontot, és a szkript első sorát tekinti meg, amely egy függvénydeklaráció. A parancssor azt is jelzi, hogy a hibakereső rendelkezik vezérléssel.
Az előnézeti sor tartalmazza a szkript nevét és az előnézeti parancs sorszámát.
Entering debug mode. Use h or ? for help.
Hit Line breakpoint on 'C:\ps-test\test.ps1:1'
test.ps1:1 function psversion {
DBG>
A Lépés paranccsal végrehajthatja az első utasítást a szkriptben, és megtekintheti a következő utasítás előnézetét. A következő utasítás az $MyInvocation
automatikus változóval állítja be a $scriptName
változó értékét a szkriptfájl elérési útjára és fájlnevére.
DBG> s
test.ps1:11 $scriptName = $MyInvocation.PSCommandPath
Ezen a ponton a $scriptName
változó nincs feltöltve, de az értékének megjelenítésével ellenőrizheti a változó értékét. Ebben az esetben az érték .$null
DBG> $scriptname
DBG>
Egy másik Step
paranccsal (s
) végrehajthatja az aktuális utasítást, és megtekintheti a szkript következő utasítását. A következő utasítás meghívja a függvényt psversion
.
DBG> s
test.ps1:12 psversion
Ezen a ponton a $scriptName
változó ki van töltve, de az értékének megjelenítésével ellenőrzi a változó értékét. Ebben az esetben az érték a szkript elérési útjára van állítva.
DBG> $scriptName
C:\ps-test\test.ps1
A függvényhívás végrehajtásához használjon egy másik lépésparancsot. Nyomja le az ENTER billentyűt, vagy írja be az "s" szót a lépéshez.
DBG> s
test.ps1:2 "PowerShell " + $PSVersionTable.PSVersion
A hibakeresési üzenet tartalmazza a függvény utasításának előnézetét. Az utasítás végrehajtásához és a függvény következő utasításának előnézetéhez használhat egy parancsot Step
. Ebben az esetben azonban használja a StepOut parancsot (o). Befejezi a függvény végrehajtását (hacsak nem éri el a töréspontot), és végrehajtja a szkript következő utasításának lépéseit.
DBG> o
Windows PowerShell 2.0
Have you run a background job today (start-job)?
test.ps1:13 "Done $scriptName"
Mivel a szkript utolsó utasításán vagyunk, a Step, StepOut és Continue parancsok hatása megegyezik. Ebben az esetben használja a StepOut (o) elemet.
Done C:\ps-test\test.ps1
PS C:\ps-test>
A StepOut parancs végrehajtja az utolsó parancsot. A szabványos parancssor azt jelzi, hogy a hibakereső kilépett, és visszaadta a vezérlőt a parancsfeldolgozónak.
Most futtassa újra a hibakeresőt. Először az aktuális töréspont törléséhez használja a parancsmagokat és Remove-PsBreakpoint
a Get-PsBreakpoint
parancsmagokat. (Ha úgy gondolja, hogy újra felhasználhatja a töréspontot, használja a Disable-PsBreakpoint
parancsmagot a Remove-PsBreakpoint
.)
PS C:\ps-test> Get-PSBreakpoint| Remove-PSBreakpoint
Ezt a parancsot a következőképpen rövidítheti:
PS C:\ps-test> gbp | rbp
Vagy futtassa a parancsot egy függvény megírásával, például a következő függvénnyel:
function delbr { gbp | rbp }
Most hozzon létre egy töréspontot a $scriptname
változón.
PS C:\ps-test> Set-PSBreakpoint -variable scriptname -script test.ps1
A parancs rövidítése a következő:
PS C:\ps-test> sbp -v scriptname -s test.ps1
Most indítsa el a szkriptet. A szkript eléri a változó töréspontját. Az alapértelmezett mód az Írás, így a végrehajtás közvetlenül a változó értékét módosító utasítás előtt leáll.
PS C:\ps-test> .\test.ps1
Hit Variable breakpoint on 'C:\ps-test\test.ps1:$scriptName'
(Write access)
test.ps1:11 $scriptName = $MyInvocation.PSCommandPath
DBG>
A változó aktuális értékének $scriptName
megjelenítése, amely a $null
következő: .
DBG> $scriptName
DBG>
A változót kitöltő utasítás végrehajtásához használjon egy Step
parancsot (s
). Ezután jelenítse meg a változó új értékét $scriptName
.
DBG> $scriptName
C:\ps-test\test.ps1
A parancs (ok) használatával megtekintheti a szkript következő utasítását.
DBG> s
test.ps1:12 psversion
A következő utasítás a függvény hívása psversion
. Ha ki szeretné hagyni a függvényt, de mégis végrehajtja, használjon egy StepOver
parancsot (v
). Ha már használatban van a függvényben StepOver
, az nem hatékony. Megjelenik a függvényhívás, de nincs végrehajtva.
DBG> v
Windows PowerShell 2.0
Have you run a background job today (start-job)?
test.ps1:13 "Done $scriptName"
A StepOver
parancs végrehajtja a függvényt, és megjeleníti a szkript következő utasítását, amely kinyomtatja az utolsó sort.
Stop
Egy parancs (t
) használatával lépjen ki a hibakeresőből. A parancssor visszaáll a szabványos parancssorra.
C:\ps-test>
A töréspontok törléséhez használja a parancsmagokat és Remove-PsBreakpoint
a Get-PsBreakpoint
parancsmagokat.
PS C:\ps-test> Get-PSBreakpoint| Remove-PSBreakpoint
Hozzon létre egy új parancstörési pontot a psversion
függvényen.
PS C:\ps-test> Set-PSBreakpoint -command psversion -script test.ps1
Ezt a parancsot a következőre rövidítheti:
PS C:\ps-test> sbp -c psversion -s test.ps1
Most futtassa a szkriptet.
PS C:\ps-test> .\test.ps1
Hit Command breakpoint on 'C:\ps-test\test.ps1:psversion'
test.ps1:12 psversion
DBG>
A szkript a függvényhíváskor eléri a töréspontot. Ezen a ponton a függvény még nem lett meghívva. Ez lehetővé teszi, hogy a Műveleti paraméterrel Set-PSBreakpoint
feltételeket állítson be a töréspont végrehajtásához, vagy előkészítő vagy diagnosztikai feladatokat hajtson végre, például naplót indíthat, vagy diagnosztikai vagy biztonsági szkripteket invoktálhat.
Művelet beállításához használja a Folytatás parancsot (c) a szkriptből való kilépéshez, és egy Remove-PsBreakpoint
parancsot az aktuális töréspont törléséhez. (A töréspontok írásvédettek, ezért nem adhat hozzá műveletet az aktuális törésponthoz.)
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>
Most hozzon létre egy új parancstörési pontot egy művelettel. Az alábbi parancs beállít egy parancstörési pontot egy olyan művelettel, amely naplózza a $scriptName
változó értékét a függvény meghívásakor. Mivel a break
kulcsszó nem szerepel a műveletben, a végrehajtás nem áll le. A backtick (`
) a vonal-folytatás karakter.
PS C:\ps-test> Set-PSBreakpoint -command psversion -script test.ps1 `
-action { add-content "The value of `$scriptName is $scriptName." `
-path action.log}
Olyan műveleteket is hozzáadhat, amelyek feltételeket határoznak meg a törésponthoz. A következő parancsban a parancs töréspontja csak akkor lesz végrehajtva, ha a végrehajtási szabályzat RemoteSigned értékre van állítva, amely a legkorlátozóbb szabályzat, amely továbbra is lehetővé teszi szkriptek futtatását.
PS C:\ps-test> Set-PSBreakpoint -script test.ps1 -command psversion `
-action { if ((Get-ExecutionPolicy) -eq "RemoteSigned") { break }}
A break
művelet kulcsszója a hibakeresőt a töréspont végrehajtására irányítja. A kulcsszóval continue
a hibakeresőt megszakítás nélkül is végrehajthatja. Mivel az alapértelmezett kulcsszó, continue
meg kell adnia break
a végrehajtás leállítását.
Most futtassa a szkriptet.
PS C:\ps-test> .\test.ps1
Hit Command breakpoint on 'C:\ps-test\test.ps1:psversion'
test.ps1:12 psversion
Mivel a végrehajtási szabályzat RemoteSigned értékre van állítva, a végrehajtás leáll a függvényhívásnál.
Ezen a ponton érdemes lehet ellenőrizni a hívás vermet. Használja a Get-PsCallStack
parancsmagot vagy a Get-PsCallStack
hibakereső parancsot (k
). Az alábbi parancs lekéri az aktuális hívási vermet.
DBG> k
2: prompt
1: .\test.ps1: $args=[]
0: prompt: $args=[]
Ez a példa csupán néhányat mutat be a PowerShell-hibakereső használatának számos módja közül.
A PowerShell egyéb hibakeresési funkciói
A PowerShell hibakeresője mellett a PowerShell számos egyéb funkciót is tartalmaz, amelyekkel szkripteket és függvényeket hibakeresésre használhat.
A
Set-PSDebug
parancsmag nagyon egyszerű szkript hibakeresési funkciókat kínál, beleértve a léptetést és a nyomkövetést.A parancsmaggal azonosíthatja a
Set-StrictMode
nem nem inicializált változókra mutató hivatkozásokat, az objektumok nem létező tulajdonságaira mutató hivatkozásokat, valamint az érvénytelen függvényszintaxisokat.Adjon hozzá diagnosztikai utasításokat egy szkripthez, például a változók értékét megjelenítő utasításokat, a parancssorból beolvasott utasításokat vagy az aktuális utasítást jelentéskészítő utasításokat. Használja azokat a parancsmagokat, amelyek a feladat írási parancsmagjait tartalmazzák, például
Write-Host
: ,Write-Debug
,Write-Warning
ésWrite-Verbose
.
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: