En utilisant Powershell v2.0, je souhaite supprimer tous les fichiers antérieurs à X jours:
$backups = Get-ChildItem -Path $Backuppath |
Where-Object {($_.lastwritetime -lt (Get-Date).addDays(-$DaysKeep)) -and (-not $_.PSIsContainer) -and ($_.Name -like "backup*")}
foreach ($file in $backups)
{
Remove-Item $file.FullName;
}
Cependant, lorsque $ backups est vide, j'obtiens: Remove-Item : Cannot bind argument to parameter 'Path' because it is null.
J'ai essayé:
- Protéger le foreach avec
if (!$backups)
- Protection de l'élément supprimé avec
if (Test-Path $file -PathType Leaf)
- Protection de l'élément supprimé avec
if ([IO.File]::Exists($file.FullName) -ne $true)
Rien de tout cela ne semble fonctionner, et si la méthode recommandée pour empêcher l'entrée d'une boucle foreach si la liste était vide?
powershell
SteB
la source
la source
Réponses:
Avec Powershell 3, la
foreach
déclaration ne se répète pas$null
et le problème décrit par OP ne se produit plus.Depuis le blog Windows PowerShell Nouvelles fonctionnalités du langage V3 :
Pour PowerShell,
$PSVersionTable.PSVersion.Major -le 2
voir ce qui suit pour la réponse d'origine.Vous avez deux options, j'utilise principalement la seconde.
Vérifiez
$backups
non$null
. Un simpleIf
tour de boucle peut vérifier non$null
Ou
Initialiser en
$backups
tant que tableau nul. Cela évite l'ambiguïté du problème "itérer le tableau vide" que vous avez posé dans votre dernière question .Désolé, j'ai négligé de fournir un exemple intégrant votre code. Notez l'
Get-ChildItem
applet de commande encapsulée dans le tableau. Cela fonctionnerait également avec des fonctions qui pourraient renvoyer a$null
.la source
Je sais que c'est un ancien article, mais je voudrais souligner que la cmdlet ForEach-Object ne souffre pas du même problème que l'utilisation du mot clé ForEach. Vous pouvez donc diriger les résultats de DIR vers ForEach et simplement référencer le fichier en utilisant $ _, comme:
Vous pouvez réellement transmettre la commande Dir elle-même via le canal et éviter même d'affecter la variable comme:
J'ai ajouté des sauts de ligne pour plus de lisibilité.
Je comprends que certaines personnes aiment ForEach / In pour plus de lisibilité. Parfois, ForEach-object peut devenir un peu velu, surtout si vous imbriquez car il devient difficile de suivre la référence $ _. En tout cas, pour une petite opération comme celle-ci, c'est parfait. Beaucoup de gens affirment également que c'est plus rapide, mais j'ai trouvé que ce n'était que légèrement.
la source
foreach
déclaration$null
n'intervient plus, donc l'erreur décrite par OP ne se produit plus. Consultez la section «L'instruction ForEach n'itère pas sur $ null» dans le blog Powershell post Nouvelles fonctionnalités du langage V3 .J'ai développé une solution en exécutant la requête deux fois, une fois pour obtenir les fichiers et une fois pour compter les fichiers en castant get-ChilItem pour renvoyer un tableau (le fait de lancer $ backups en tant que tableau après le fait ne semble pas fonctionner) .
Au moins, cela fonctionne comme prévu (les performances ne devraient pas être aussi problématiques car il n'y aura jamais plus d'une douzaine de fichiers), si quelqu'un connaît une solution à requête unique, veuillez la poster.
la source
Utilisez ce qui suit pour évaluer si le tableau a du contenu:
Si la variable n'existe pas, Powershell l'évaluera simplement comme fausse, donc pas besoin de vérifier si elle existe.
la source