Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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ője frissült a távoli számítógépek konzolján vagy Windows PowerShell integrált szkriptelési környezetében (ISE) futó szkriptek, függvények, parancsok, konfigurációk vagy kifejezések hibakeresésére.
Megjegyzés:
A Windows PowerShell ISE 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 ISE-ben használja a Hibakeresés menü parancsait.
Megjegyzé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ásra kerülnek, de nem léptethetők végig.Ctrl+Break: (Az ISE-ben az összes megszakítása) A PowerShell-konzolon vagy a Windows PowerShell ISE-n belül 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ásra kerülnek, de nem léptethetők végig.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ásra kerülnek, de nem léptethetők végig.l, :ListMegjelení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>, :ListA 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, ,StopExit: Leállítja a szkript végrehajtását, és kilép a hibakeresőből. Ha a parancsmag futtatásávalDebug-Jobhibakeresést végez egy feladaton, aExitparancs leválasztja a hibakeresőt, és engedélyezi a feladat futtatását.k, :Get-PsCallStackAz aktuális hívásverem megjelenítése.<Enter>: Megismétli az utolsó parancsot, ha az (), (Step) vagys(StepOver) voltv.ListlEllenkező esetben küldési műveletet jelöl.?, :hMegjelení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-JobDebug-Runspacea .
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.
Megjegyzé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ó $PSDebugContexta 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éldául:
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-AliasGet-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éldául:
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 Get-PsBreakpoint a Remove-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 $nullkö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 Get-PsBreakpoint a Remove-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ó, continuemeg 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-PSDebugparancsmag 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-StrictModenem 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.