2017-04-12 36 views
-1

我有一个脚本在文件即将达到其最大大小时发送电子邮件。在PowerShell脚本中定位测试路径

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

我知道,我应该实现:

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',因为它不存在。

+0

粘贴在PS控制台中的确切错误,在这里。即使文件存在,你的意思是Get-Item失败吗? '$ files'和'$ list'如何填充? – niksofteng

+0

增加了错误。没有一切正常,但我试图在文件不存在时“捕捉” –

+0

'$ files'和'$ list'的内容是什么?字符串? FileInfo对象?还有别的吗? –

回答

1

您试图错误处理,但是然后您的代码仍将控制权交给主逻辑。相反,您应该开发控制流程,以便仅当Test-Path返回true时才会调用Get-Item

$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

+0

它的工作原理,但我不能在'else'中获得文件名,即使我使用'$ file'或'$ f.Name' –

+0

使用'$ file.path '在那里。看,校对不足以完成代码的一部分 - 我在代码中也遗漏了一个变量。 – Vesper

+0

非常感谢Vesp –

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" 
     } 
    } 
} 
+0

我无法使用发送邮件中的邮件 –

+0

查看更新。 @KahnKah – niksofteng

+0

Tyvm为答案Nikhil V. –

相关问题