如何在PowerShell中不使用Try-Catch检测非错误执行状态
PowerShell 检测 Remove-Item 无错误执行状态的正确写法
原代码问题分析
你现有代码的判断逻辑不成立:$error是PowerShell全局维护的错误记录数组,哪怕没有产生任何错误,它也不等于空字符串,因此if ($error -eq '')的判断永远不会触发$NumOK++的分支。
此外,即使你指定了-ErrorAction 'SilentlyContinue',目录不存在触发的错误仍然会被写入$error数组,旧的判断条件也无法正确识别这种情况。
可直接使用的实现方案
方案1:用$?自动变量(最简洁)
PowerShell内置的$?变量会直接返回上一条命令的执行结果:执行成功为$true,出现任何错误为$false,完全适配当前场景:
$error.Clear() Remove-Item -Recurse -Force $DirName -ErrorAction SilentlyContinue if ($?) { $NumOK++ }
方案2:用$error计数判断(适配你原有思路)
如果要沿用你基于$error做判断的思路,只需要把判断条件改为检测错误计数即可:
$error.Clear() Remove-Item -Recurse -Force $DirName -ErrorAction SilentlyContinue if ($error.Count -eq 0) { $NumOK++ }
方案3:仅忽略「路径不存在」错误(灵活适配业务需求)
如果你只是不需要处理目录不存在的场景,但需要捕获其他错误(比如权限不足、文件被占用),可以用错误变量过滤指定错误类型:
Remove-Item -Recurse -Force $DirName -ErrorAction SilentlyContinue -ErrorVariable removeErr # 过滤掉路径不存在的特定错误 $unexpectedErr = $removeErr | Where-Object { $_.FullyQualifiedErrorId -ne 'PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand' } # 没有意外错误则计数+1 if (-not $unexpectedErr) { $NumOK++ }
内容的提问来源于stack exchange,提问作者johny why
相关产品推荐
相关产品推荐

