単純な問題のように思えるので、ここで困惑しています。こっちの骨頭がすいません。
機能していないバックアップファイルをクリーンアップするスクリプトがあります。ファイルを特定した後、ループし、何がダンプされているかを出力します。私の問題は、無効なファイルがゼロのときにフィードバック/テストを提供しようとするときに発生します。スクリプトは次のようになります...
$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
結果なし?
@(..)
でラップしてみてください。それは常に配列を作成します:
$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 {
..
}
ファイルがない場合、$ Filesは$ nullに等しいので、EBGreenは$ nullに対してテストする必要があることを示唆しています。また、$ Files.Countは、結果がファイルのコレクションである場合にのみ役立ちます。結果がスカラー(1つのオブジェクト)の場合、countプロパティがなく、比較は失敗します。
パフォーマンスのヒント:1つの拡張タイプのみを検索する必要がある場合は、プロバイダーレベルでフィルタリングするため、(-Includeではなく)-Filterパラメーターを使用します。
スキャンされたフォルダーが空の場合、変数はnull値の式に評価されます。以下を使用できます。
if (!$Files) {
# ...
}
$ files -eq $ nullもテストしてみてください。
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"}