我正在编写一个脚本来替换我们公司的壁纸。该脚本以管理员身份运行良好,但如果出现问题,我想将其捕获。以下是代码片段(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",它按我预期的方式工作,然后我删除它,它仍然按预期工作!