PowerShell Try/Catch 不起作用

PowerShell Try/Catch 不起作用

我正在编写一个脚本来替换我们公司的壁纸。该脚本以管理员身份运行良好,但如果出现问题,我想将其捕获。以下是代码片段(Write-Log 是一种将数据写入我们 Logs 文件夹中的自定义日志文件的函数)

try{
    Write-Log "Attempting to copy new wallpaper"
    Copy-Item $PSScriptRoot\img0.jpg C:\windows\WEB\wallpaper\Windows\img0.jpg | Out-Null
    Copy-Item $PSScriptRoot\4k\*.* C:\Windows\Web\4K\Wallpaper\Windows | Out-Null
    Write-Log "Task completed."
}catch{
    write-Log("Error occured:"+$Error[0].Exception.Message )
}

当以非管理员身份且没有文件权限运行时,它会为所有文件引发以下错误。

复制项目:拒绝访问路径“C:\windows\WEB\wallpaper\Windows\img0.jpg”。

Catch 部分难道不应该捕获复制项没有权限的情况吗?

答案1

Try 块仅捕获终止错误,而复制文件失败不属于此类错误。您可以Copy-Item通过添加以下代码强制在失败时终止:

$ErrorActionPreference = "Stop"

到脚本的开头。这样,任何错误都将被视为终止错误,因此控制将跳转到该catch块。

答案2

您可以将通用参数 ErrorAction 值设置为 Stop,以在 catch 块上捕获非终止错误。或者您可以设置首选项变量的值,如另一个答案所示。例如:

Cmdlet -Parameters Value -ErrorAction Stop 

答案3

仅供参考,我有一个声明,即使它最后有 -ErrorAction Stop,它也不会停止而是继续运行。

我在代码中添加了 $ErrorActionPreference = "Stop",它按我预期的方式工作,然后我删除它,它仍然按预期工作!

相关内容