Проблема с игнорированием неверного пути в функции powershell - PullRequest
1 голос
/ 28 сентября 2019

Я не могу заставить мою функцию пропускать несуществующую папку и продолжает проверять другие.

Я создал небольшую функцию, которая измеряет папки.Это работает, но если путь к папке неправильный, вся функция останавливается, хотя все остальное в порядке.

Я пробовал несколько вещей с try и 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

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

это НЕ ответ - он существует, чтобы показать соответствующий код и ответ, который я получаю.обратите внимание, что ваши результаты сильно отличаются от моих ... так что это позволяет нам обоим тестировать один и тот же код.

Я переформатировал ваш код, так как сломанный отступ сделал чтение его раздражающим, как черт.[ ухмылка ]

ваш код, переформатированный ...

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 ...

обратите внимание, что для двух действительных каталогов нет выходных данных, но вы сообщаете, что получили два действительных размера каталогов И ошибка не обнаружена.

0 голосов
/ 28 сентября 2019

Чтение about_Throw : Ключевое слово Throw вызывает ошибку завершения .

function get-folder {
    [cmdletbinding()]
    param (
        [ValidateScript({
            if( -not ($_ | Test-Path) ) {
                Write-Error "$_`: PATH DOESN'T EXIST!"  ### omit
            }
            return $true
        })]
        [parameter(valueFromPipeline=$true)]
        [string[]]$path
    )
    begin {}
    process { 
        foreach ($p in $path){
            try {
                [PSCustomObject] @{
                Name = $p
                Bytes = Get-ChildItem -path $p -Recurse -File -ErrorAction Stop | 
                    Measure-Object -Property Length -Sum |
                        Select-Object -ExpandProperty Sum
                }
            }
            catch {
                Write-Warning "The path: $p doesn't exist"
            }
        }
    }
    end{}
}

Вывод ниже показывает, что вы можете опуститьатрибут проверки ValidateScript вообще (или, по крайней мере, Write-Error "$_: PATH DOESN'T EXIST!"), поскольку

  • ошибка Cannot find path 'D:\testttt' … генерируется командлетом Get-ChildItem,
  • , следовательно, D:\testttt: PATH DOESN'T EXIST! из ValidateScript, кажется, здесь избыточно.

Выход :

. D:\PShell\SO\58149019.ps1
$Error.Clear(); get-folder C:\testC, D:\test, D:\testttt
$Error.Count
$Error | ForEach-Object { $_.Exception }
WARNING: The path: D:\testttt doesn't exist
Name          Bytes
----          -----
C:\testC        408
D:\test  3513654559
2
Cannot find path 'D:\testttt' because it does not exist.
D:\testttt: PATH DOESN'T EXIST!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...