web-dev-qa-db-ja.com

Get-ChildItemで結果がない(ファイルがゼロ)かどうかをテストするにはどうすればよいですか?

単純な問題のように思えるので、ここで困惑しています。こっちの骨頭がすいません。

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

$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結果なし?

31
EBarr

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

$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 {
  ..
}
49
stej

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

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

13
Shay Levy

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

if (!$Files) {
# ...
}
7
Emiliano Poggi

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

4
EBGreen

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

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

Ifステートメントで使用

if ([bool](Get-ChildItem C:\foo.txt)) {write-output "foo.txt exists"}
0
mil bauer