PowerShell:捕获错误但不循环继续?
我喜欢认为我对PowerShell很在行,但我在这里有点不知所措 我有一个巨大的文件列表,我将在上面运行此代码,这将给我一些必要的文件信息,我将运行分析。第一步就是获取文件列表。所以我运行这个PowerShell:捕获错误但不循环继续?,powershell,try-catch,Powershell,Try Catch,我喜欢认为我对PowerShell很在行,但我在这里有点不知所措 我有一个巨大的文件列表,我将在上面运行此代码,这将给我一些必要的文件信息,我将运行分析。第一步就是获取文件列表。所以我运行这个 Get-ChildItem $path -Recurse 这返回了一堆无用的信息,但也给了我一片红色的海洋。有大量的文件和文件夹无法找到,并明确拒绝我。我想捕获所有这些错误,以便将它们解析为相关信息,因此我的直觉告诉我使用Try/catch 通常,您使用Try/Catch将错误消息存储在循环之外的某个循
Get-ChildItem $path -Recurse
这返回了一堆无用的信息,但也给了我一片红色的海洋。有大量的文件和文件夹无法找到,并明确拒绝我。我想捕获所有这些错误,以便将它们解析为相关信息,因此我的直觉告诉我使用Try/catch
通常,您使用Try/Catch将错误消息存储在循环之外的某个循环中,这非常有效。但实际上我没有一个循环可以继续。我不知道现在该怎么办。这是我的源代码
function Get-FileInfo {
Param(
[Parameter(Mandatory=$True,Position=0)]
[ValidateNotNull()]
[string]$path
)
$global:errorInfo = @()
Write-Host "I started!"
Try {
Write-Host "I started the Try Statement!"
$fileInfo = Get-ChildItem $path -Recurse -ErrorAction Stop
Write-Host "I finished the main pull!"
Return $fileInfo
}
Catch {
Write-Host "I started the Catch Statement!"
$errorObj = New-Object PSObject
Add-Member -inputObject $errorObj -memberType NoteProperty -name “Type” -value $_.Exception.Message
Add-Member -inputObject $errorObj -memberType NoteProperty -name “Item” -value $_.Exception.ItemName
$errorInfo += $errorObj
Continue
}
}
我相信你看到了问题所在。我想捕获Try块中不可避免的错误,但实际上我没有循环。我真的不知道如何将其设置为一个循环,以使事情变得更好
如果我运行这段代码,它会立即写“我开始了!”然后写“我开始了Try语句”。然后它会工作大约一分钟。然后我得到一个“我开始了捕获声明!”并且它立即结束。这是有道理的,但这显然不是预期的结果
我只是想错了吗?您描述的错误是非终止错误,您可以在 带有的变量,在第一个错误时不停止命令(这是
-ErrorAction Stop
所做的)
- 请注意,由于传递的是变量名,而不是其值,因此必须在不使用
的情况下指定目标变量名$
errs
被创建为局部变量$errs
- 通常最好避免设置跨越范围边界的变量,但也可以将变量作为脚本范围/全局范围的目标,即使用
/-ErrorVariable脚本:errs
-ErrorVariable全局:errs
- 通常最好避免设置跨越范围边界的变量,但也可以将变量作为脚本范围/全局范围的目标,即使用
- 要使错误静音,请使用
,而不是-ErrorAction SilentlyContinue
——后者将完全抑制错误,使-ErrorAction Ignore
为空$errs
-ErrorAction Stop
所做的)
- 请注意,由于传递的是变量名,而不是其值,因此必须在不使用
的情况下指定目标变量名$
errs
被创建为局部变量$errs
- 通常最好避免设置跨越范围边界的变量,但也可以将变量作为脚本范围/全局范围的目标,即使用
/-ErrorVariable脚本:errs
-ErrorVariable全局:errs
- 通常最好避免设置跨越范围边界的变量,但也可以将变量作为脚本范围/全局范围的目标,即使用
- 要使错误静音,请使用
,而不是-ErrorAction SilentlyContinue
——后者将完全抑制错误,使-ErrorAction Ignore
为空$errs
-ErrorVariable
默认创建局部变量,但如果需要,您可以使用范围修饰符-请查看我的更新。我尝试了这段代码,但我的错误变量仍然为空。不过我知道有些错误。它是否与作为一个全局变量有关?-ErrorVariable是否创建局部变量?@lordsampigans:是的,-ErrorVariable
默认创建局部变量,但如果需要,您可以使用范围修饰符-请参阅我的更新。
# Silence non-terminating errors and collect them in variable $errs
Get-ChildItem $path -Recurse -ErrorAction SilentlyContinue -ErrorVariable errs