2017-04-12 9 views
-1

ファイルが最大サイズに達すると電子メールを送信するスクリプトがあります。PowerShellスクリプトでのテストパスの配置

問題は、特定のパスにファイルが見つからないときにスクリプトが行うべきことの検証チェックを実装できないということです。

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

しかし、(私はすべての場所でエラーを取得していますので)私はまさにそれをどこに配置するかわからない:

は私が実装しなければならないことを知っています。

コード:

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) 
{ 
    $f = Get-Item $file.Path 
    New-Object -Type PSObject -Property @{ 

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

が、私は、ファイルのリストをループしてその大きさを確認してください。私は、configファイルからファイルを取り出すで始まる

私はこれらの場所でエラーチェックを実装しようとしました:

$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

エラー処理しようとしていますが、コードがまだメインロジックに制御を渡しています。代わりに、Get-ItemTest-Pathがtrueを返す場合にのみ呼び出されるように、コントロールフローを開発する必要があります。

$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

'$ file'や' $ f.Name'を使っても 'else'でファイル名を取得できません –

+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 Answer Nikhil V. –

関連する問題