En Powershell, comment puis-je tester si un répertoire est vide ?
Réponses
Trop de publicités?#Define Folder Path to assess and delete
$Folder = "C:\Temp\Stuff"
#Delete All Empty Subfolders in a Parent Folder
Get-ChildItem -Path $Folder -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
#Delete Parent Folder if empty
If((Get-ChildItem -Path $Folder -force | Select-Object -First 1 | Measure-Object).Count -eq 0) {Remove-Item -Path $CATSFolder -Force -Recurse}
L'obtention d'un compte à partir de Get-ChildItem peut fournir des résultats erronés car un dossier vide ou une erreur d'accès à un dossier peut entraîner un compte nul.
La façon dont je vérifie les dossiers vides est de séparer les erreurs :
Try { # Test if folder can be scanned
$TestPath = Get-ChildItem $Path -ErrorAction SilentlyContinue -ErrorVariable MsgErrTest -Force | Select-Object -First 1
}
Catch {}
If ($MsgErrTest) { "Error accessing folder" }
Else { # Folder can be accessed or is empty
"Folder can be accessed"
If ([string]::IsNullOrEmpty($TestPath)) { # Folder is empty
" Folder is empty"
}
}
Le code ci-dessus essaie d'abord d'accéder au dossier. Si une erreur se produit, il indique qu'une erreur s'est produite. S'il n'y a pas d'erreur, il indique que "Le dossier est accessible", et vérifie ensuite s'il est vide.
Après avoir examiné certaines des réponses existantes et expérimenté un peu, j'ai fini par utiliser cette approche :
function Test-Dir-Valid-Empty {
param([string]$dir)
(Test-Path ($dir)) -AND ((Get-ChildItem -att d,h,a $dir).count -eq 0)
}
Cela permettra vérifiez d'abord si le répertoire est valide ( Test-Path ($dir)
). Il vérifiera ensuite tout contenu, y compris les répertoires, les fichiers cachés ou les fichiers "normaux "**, grâce aux attributs suivants d
, h
y a
respectivement.
L'utilisation doit être suffisamment claire :
PS C_\> Test-Dir-Valid-Empty projects\some-folder
False
...ou alternativement :
PS C:\> if(Test-Dir-Valid-Empty projects\some-folder){ "empty!" } else { "Not Empty." }
Not Empty.
** En fait, je ne suis pas sûr à 100% de ce que l'effet défini de de a
est ici, mais elle provoque dans tous les cas l'inclusion de tous les fichiers. La documentation indique que ah
montre les fichiers cachés, et je crois as
devrait montrer les fichiers système, donc je suppose que a
n'affiche que les fichiers "normaux". Si vous le supprimez de la fonction ci-dessus, elle trouvera dans tous les cas les fichiers cachés, mais pas les autres.