34

私はここで、単純な問題のように思われることに困惑しています。ここで骨が折れるのはごめんなさい。

無効なバックアップファイルをクリーンアップするスクリプトがあります。ファイルを特定した後、ループして、ダンプされているものを出力します。私の問題は、無効なファイルがゼロのときにフィードバック/テストを提供しようとすると発生します。スクリプトは次のようになります...

$Files = Get-ChildItem $BackupPath_Root -include *.bak -recurse 
           | where {$_.CreationTime  -le $DelDate_Backup }  

if ( $Files -eq "" -or $Files.Count  -eq 0 ) {
    write-host "   no files to delete."    #<-- this doesn't print when no files
} else {
   foreach ($File in $Files) {
      write-host “$File” 
      Remove-Item $File | out-null
   } 
}

ファイルがないかどうかをチェックしても、ファイルがない状態は検出されません。結果がないかどうかをテストする適切な方法は何$Filesですか?

4

5 に答える 5

59

でラップしてみてください@(..)。常に配列を作成します。

$Files = @(Get-ChildItem $BackupPath_Root -include *.bak -recurse 
           | where {$_.CreationTime  -le $DelDate_Backup })
if ($Files.length -eq 0) {
  write-host "   no files to delete." 
} else {
  ..
}
于 2011-07-28T13:56:32.517 に答える
16

ファイルがない場合、$Filesは$nullに等しいので、EBGreenが提案するように、$nullに対してテストする必要があります。また、$ Files.Countは、結果がファイルのコレクションである場合にのみ役立ちます。結果がスカラー(1つのオブジェクト)の場合、countプロパティがなく、比較は失敗します。

パフォーマンスのヒント:1つの拡張タイプのみを検索する必要がある場合は、プロバイダーレベルでフィルタリングするため、(-Includeではなく)-Filterパラメーターを使用します。

于 2011-07-28T13:57:35.283 に答える
9

スキャンされたフォルダーが空の場合、変数はnull値の式に評価されます。次を使用できます。

if (!$Files) {
# ...
}
于 2011-07-28T14:21:12.650 に答える
4

$ files -eq$nullもテストしてみてください。

于 2011-07-28T13:49:41.113 に答える
2

get-childitemコマンドの前に[bool]型を指定すると、何かが見つかった場合はTrueが返され、何も見つからなかった場合はfalseが返されます。これはエミリアーノの答えがしていることですが、否定的な要件はありません。どちらも機能させることができますが、わかりやすくするために、より複雑な条件ステートメントをいくつか使用することをお勧めします。

[bool](Get-ChildItem C:\foo.txt)

Ifステートメントで使用されます

if ([bool](Get-ChildItem C:\foo.txt)) {write-output "foo.txt exists"}
于 2018-02-21T17:36:49.223 に答える