引发未捕获的异常时,如何还原PowerShell脚本中的目录更改?

Chr*_*ley 3 powershell

在bash中,如果我想为单个命令更改当前目录do_thing,我将生成一个新的子shell,在其中更改目录,运行

(cd folderName; do_thing)
Run Code Online (Sandbox Code Playgroud)

问题的内容表明,在PowerShell中执行此操作的方法是使用Push-Location存储位置以及Pop-Location命令完成运行后的位置。这行得通,但并不理想:我必须记住Pop-Location在脚本的每个返回点处进行写入(例如,在每个异常之前,如果在按下某个位置时发生异常),则未捕获的异常将照原样保留当前目录。

有没有一种方法可以将当前目录重置为脚本开始时的状态,即使抛出未捕获的异常也是如此?

gve*_*vee 8

try...catch...finally 是您要寻找的结构!

这将使您能够处理错误并执行最终操作;主try块是否成功。

这是一个基本示例:

try {
    $x = 1/0
}
catch {
    Write-Warning "An error occurred"
}
finally {
    Write-Output "This always runs"
}
Run Code Online (Sandbox Code Playgroud)

更适合您的情况:

Write-Output "BEFORE: $(Get-Location)"

Push-Location -Path "C:\temp\csv"

try {
    Write-Output "DURING TRY: $(Get-Location)"
    $x = 1/0
}
catch {
    Write-Warning "An error occurred"
}
finally {
    Pop-Location
}

Write-Output "AFTER: $(Get-Location)"
Run Code Online (Sandbox Code Playgroud)

结果:

之前:C:\ temp

尝试期间:C:\ temp \ csv

警告:发生错误

之后:C:\ temp