在PowerShell脚本中定位测试路径

时间:2017-04-12 09:09:37

标签: powershell error-handling

我有一个脚本,当文件即将达到最大尺寸时发送电子邮件。

问题是,我无法对在给定路径中找不到文件时脚本应该执行的操作进行验证检查。

我知道我应该实施:

if(!(Test-Path $item.Path))
{
   "The file " + $item.Name + " is not found! <br />" 
}

但我不知道在哪里放置它(因为我到处都是错误)。

守则:

我首先从配置文件中检索文件:

$list = foreach ($file in $files)
{   
    $f = Get-Item $file.Path
    New-Object -Type PSObject -Property @{

    Name = $f.Name
    Path = $file.Path
    Size = ($f.Length/$byteSize)
    }
}

然后我遍历文件列表并检查它们的大小:

foreach ($item in $list)
{
    if($item.Size -gt $item.TriggerSize -And (Test-Path $item.Path))
    {
        #Write-Host $item.Name "Warning! File has reached it's max limit ("$item.Size.ToString(".00")"), The max size is" $item.MaxSize". The trigger size is: " $item.TriggerSize "`r`n"

        $body +=

        "The file " + $item.Name + " is reaching his max size! 
        <br /> Current size: <b>"+$item.Size.ToString(".00") + " " + $byteSize.Substring(1) + "</b>"  + 
        "<br /> Maximum size: " + $item.MaxSize + " " + $byteSize.Substring(1) + "<br /><br />"
    }
}

我尝试在这些地方实施错误检查:

$list = foreach ($file in $files)
{   

  if(!(Test-Path $item.Path))
        {
           "The file " + $item.Name + " is not found! <br />" 
        }

    $f = Get-Item $file.Path
    New-Object -Type PSObject -Property @{

    Name = $f.Name
    Path = $file.Path
    Size = ($f.Length/$byteSize)
    }
}

在这里

foreach ($item in $list)
{
    if($item.Size -gt $item.TriggerSize -And (Test-Path $item.Path))
    {
        #Write-Host $item.Name "Warning! File has reached it's max limit ("$item.Size.ToString(".00")"), The max size is" $item.MaxSize". The trigger size is: " $item.TriggerSize "`r`n"

        $body +=

        "The file " + $item.Name + " is reaching his max size! 
        <br /> Current size: <b>"+$item.Size.ToString(".00") + " " + $byteSize.Substring(1) + "</b>"  + 
        "<br /> Maximum size: " + $item.MaxSize + " " + $byteSize.Substring(1) + "<br /><br />"
    }

  if(!(Test-Path $item.Path))
    {
       "The file " + $item.Name + " is not found! <br />" 
    }
}

但我不断收到Get-Item无法找到文件的错误:

我故意用虚假路径写的文件的名称: 的 file123.exe

错误(位于if(!(Test-Path $file.path))

的行
  

Get-Item:找不到路径'file123.exe',因为它不存在。

2 个答案:

答案 0 :(得分:1)

您只检查文件的存在而不是捕获未找到的异常。这是一个应该起作用的伪:

foreach ($file in $files) {     
    try {
        if (!(Test-Path $file.Path)) {
            throw "File $($file.Path) not found"
        }           
        # Rest of the logic
    }
    catch {
        # log error $_.Exception.Message
    }
}

更新:无论文件是否存在,都会发送电子邮件。这是伪造的借口语法。

以单独的方式重构电子邮件发送功能,例如Send-Email($content)。然后:

foreach file in files {
    if !(Test-Path file.path) {
        Send-Email -content "File $($file) does does not exist"
    }
    else {
        // your logic here
        if file.size > threshold {
            Send-Email -content "File $($file) exceeded threshold size"
        }
    }
}

答案 1 :(得分:1)

您正在尝试错误处理但是您的代码仍将控制权传递给主逻辑。相反,您应该开发控制流,以便仅在Get-Item返回true时才调用Test-Path

$list = foreach ($file in $files)
{   
  if (Test-Path $file.Path) {

    $f = Get-Item $file.Path
    New-Object -Type PSObject -Property @{

      Name = $f.Name
      Path = $f.Path
      Size = ($f.Length/$byteSize)
    }
  } else {
    "The file " + $file.path + " is not found! <br />" 
  }
}

最后,保护您的代码!您已对$item.path进行了测试,但访问了$file.path。鉴于你的foreach循环,你应该在两个地方都有$file.path