web-dev-qa-db-fra.com

Comment Get-ChildItem peut-il être testé sans résultats (zéro fichier)?

Je suis perplexe ici sur ce qui semble être un problème simple; tellement désolé pour toute tête naïve ici.

J'ai un script qui nettoie les fichiers de sauvegarde obsolètes. Après avoir identifié les fichiers, je retourne en boucle et j'imprime ce qui est vidé. Mon problème survient lorsque je tente de fournir des commentaires/tests lorsqu'il n'y a aucun fichier périmé. Le script ressemble à ...

$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
   } 
}

La vérification de l'absence de fichier n'attrape pas la condition d'absence de fichier. Quelle est la manière appropriée de tester $Files sans résultats?

27
EBarr

Essayez d’emballer dans @(..). Il crée toujours un tableau:

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

Lorsqu'il n'y a pas de fichiers, $ Files est égal à $ null. EBGreen suggère donc de tester sur $ null. De plus, $ Files.Count n'est utile que lorsque le résultat est une collection de fichiers. Si le résultat est un scalaire (un objet), il n'aura pas de propriété count et la comparaison échouera. 

Conseil de performance: lorsque vous devez rechercher un seul type d’extension, utilisez le paramètre -Filter (au lieu de -Include) car il filtre au niveau du fournisseur.

13
Shay Levy

La variable est évaluée à une expression null lorsque le dossier analysé est vide. Vous pouvez utiliser:

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

Essayez également de tester $ files -eq $ null.

4
EBGreen

Spécifier le type [bool] devant une commande get-childitem retournera True si quelque chose est trouvé, ou false si rien n'est trouvé. C'est ce que fait la réponse d'Emiliano, mais sans l'exigence négative. Vous pouvez faire fonctionner l'un ou l'autre, mais je préfère [bool] avec certaines des instructions conditionnelles les plus complexes, juste pour le rendre plus facile à suivre.

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

Utilisé dans une déclaration If

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