gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:57:12 26 4
gpt4 key购买 nike

我无法强制我的功能跳过不存在的文件夹并继续检查其他文件夹。

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

我尝试了一些尝试和捕获,$ 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

最佳答案

阅读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' … cmdlet
  • 生成 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!

    关于powershell - 在Powershell函数中忽略错误路径的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58149019/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com