在powershell函数中忽略错误路径的问题

在powershell函数中忽略错误路径的问题,powershell,error-handling,Powershell,Error Handling,我无法强制我的函数跳过一个不存在的文件夹并不断检查其他文件夹 我创建了一个测量文件夹的小函数。它确实可以工作,但如果文件夹的路径错误,则整个功能将停止,即使其余的功能正常 我用try-and-catch、$ErrorActionPreference和errorAction尝试了几件事,但都没有成功。看起来要么我把它们放错了地方,要么错误是由ValidateScriptParameter引起的,如果路径不存在,它会停止循环 如果我看到我的代码按照我的预期工作,我将很高兴得到关于如何最好地解决这个问

我无法强制我的函数跳过一个不存在的文件夹并不断检查其他文件夹

我创建了一个测量文件夹的小函数。它确实可以工作,但如果文件夹的路径错误,则整个功能将停止,即使其余的功能正常

我用try-and-catch、$ErrorActionPreference和errorAction尝试了几件事,但都没有成功。看起来要么我把它们放错了地方,要么错误是由ValidateScriptParameter引起的,如果路径不存在,它会停止循环

如果我看到我的代码按照我的预期工作,我将很高兴得到关于如何最好地解决这个问题的任何建议:)这将有助于我理解PS中的错误处理

function get-folder {
[cmdletbinding()]
param (
    [ValidateScript({
        if( -not ($_ | Test-Path) ){
            throw "PATH DOESN'T EXIST!" }
            return $true
            })]
    [parameter(valueFromPipeline=$true)]
    [string[]]$path)
begin {}
process 
{ 
foreach ($p in $path){
try {
   Get-ChildItem -path $p -Recurse -File | Measure-Object -Property Length 
-Sum 
    }
catch  
{Write-Warning "The path: $p doesn't exist"
}
}
}
end{}
}
当其中一条路径不正确时,我收到的错误消息:

PS C:\powershell\Moje_nowe> get-folder "C:\powershell", 
"c:\!dump","c:\hostt"
get-folder : Cannot validate argument on parameter 'path'. PATH DOESN'T 
EXIST!
At line:1 char:12
+ get-folder "C:\powershell", "c:\!dump","c:\hostt"
+            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [get-folder], 
ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,get-folder
读取:
Throw
关键字导致终止错误

下面的输出显示,您可以完全忽略
ValidateScript
验证属性(或者至少是
写入错误“$\uU4:路径不存在!”
),因为

  • 找不到路径“D:\testttt”…
    错误是由
    Get-ChildItem
    cmdlet生成的
  • 因此
    D:\testttt:PATH不存在ValidateScript
    中的code>似乎太多了
输出

. D:\PShell\SO\58149019.ps1
$Error.Clear(); get-folder C:\testC, D:\test, D:\testttt
$Error.Count
$Error | ForEach-Object { $_.Exception }

这不是一个答案-它的存在是为了显示所涉及的代码&我得到的响应。请注意,您的结果似乎与我的大不相同。。。因此,这允许我们都测试相同的代码

我重新格式化了你的代码,因为破损的缩进让阅读变得很烦人。[咧嘴笑]

你的代码,重新格式化

function get-folder
    {
    [cmdletbinding()]
    param (
        [ValidateScript({
            if( -not ($_ | Test-Path) ){
                throw "PATH DOESN'T EXIST!" }
                return $true
                })]
        [parameter(valueFromPipeline=$true)]
        [string[]]
        $path)

    begin {}

    process 
        { 
        foreach ($p in $path)
            {
            try {
                Get-ChildItem -path $p -Recurse -File |
                    Measure-Object -Property Length -Sum 
                }
                catch  
                {
                Write-Warning "The path: $p doesn't exist"
                }
            }
        } # end >>> process

    end {}

    } # end >>> function get-folder
我的测试代码

try
    {
    get-folder -path c:\temp, C:\PerfLogs, c:\NotThere
    }
    catch
    {
    Write-Warning 'Something went wrong ...'
    }
屏幕输出

WARNING: Something went wrong ...

请注意,这两个有效的dir没有输出,但是您报告您获得了两个有效的dir大小,并且没有捕获错误

您需要将对函数的调用包装在try/catch块中。像这样的东西…>>><代码>尝试{get folder-path c:\ziggity}catch{Write Warning'Something error!'}
警告:Something error你所说的“呼叫”是什么意思?我有这个,出于某种原因,它没有给我“catch”中定义的警告,只是参数中给出的错误。也许我把它放错位置了?调用是
get folder-path c:\folderthat aint
。当我将你的代码用于函数并以我上一次回复中所示的方式使用它时,它会抑制错误消息并仅显示
catch
块输出。我现在理解了你,但你的方式对我没有帮助。当我给它一个不存在的3个文件夹时,它给出了2个和NA错误的度量,即第三个不正确,但是它仍然试图在磁盘C::/@ DAFSIO上找到它,请考虑使用<代码> catch {写警告$$.Exabut.Meult} <代码>,而不是<代码> catch {写警告“路径:$p不存在”}。
由于
try
块中的命令可能会由于另一个原因而失败……我尝试了两种方法,都取得了中等成功。在将错误的路径添加为参数后,脚本不会失败(感谢@JosefZ!)它会为2个正确的路径提供输出,但如果第三个路径由于某种原因错误,我猜它会尝试在整个C中搜索错误的文件夹:最后给我错误,它无法读取某些路径。@Dafsio请使用
Get ChildItem-path“$p\*”-递归-文件-错误操作停止
。抱歉,我测试它时忽略了
-Recurse
参数(我可以通过设计
-Recurse
开关来确认所描述的行为:递归搜索给定路径的叶)…
try
    {
    get-folder -path c:\temp, C:\PerfLogs, c:\NotThere
    }
    catch
    {
    Write-Warning 'Something went wrong ...'
    }
WARNING: Something went wrong ...