PowerShell - La plupart de façon compacte « Supprimer tous les fichiers de ce dossier, sauf un »

StackOverflow https://stackoverflow.com/questions/570330

  •  05-09-2019
  •  | 
  •  

Question

Quelle est la façon la plus compacte de supprimer tous les fichiers d'un dossier sauf un fichier dans un script PowerShell. Je ne compte pas du tout quel fichier est conservé, aussi longtemps que l'une est conservée.

J'utilise PowerShell 2 CTP.

Mise à jour: Une fusion de toutes les réponses à ce jour ...

$fp = "\\SomeServer\SomeShare\SomeFolder"
gci $fp |where {$_.mode -notmatch "d"} |sort creationtime -desc |select -last ((@(gci $fp)).Length - 1) |del 

Tout le monde voir des problèmes avec l'aide de cela? Que diriez-vous de la part -notmatch?

Était-ce utile?

La solution

Dans PS V2 nous avons ajouté -skip pour sélectionner, vous pouvez donc faire:

dir | où {$ _ le mode -notmatch "d".} | sélectionner -skip 1 | del

Autres conseils

Sans fonctions intégrées, il est un peu alambiquée, car les fonctions NEEED pour faire face à la longueur définitive. Mais vous pouvez le faire de cette façon qui consiste à regarder le répertoire deux fois

gci $dirName | select -last ((@(gci $dirName)).Length-1) | del

J'ai écrit plusieurs extensions PowerShell qui font des tâches comme celui-ci beaucoup plus facile. Un exemple est Skip-Count qui permet un nombre arbitraire d'éléments à sautées dans le pipeline. Ainsi, le code peut être rapidement recherché seulement regarder le répertoire une fois

gci $dirName | skip-count 1 | del

Source pour SAUT Count: http://blogs.msdn.com/jaredpar/archive/2009/01/13/linq-like-functions-for-powershell-skip-count.aspx

EDIT

Pour tuer les dossiers utilisent "rm -re -FO" au lieu de "del"

EDIT2

Afin d'éviter tous les dossiers (vide ou non), vous pouvez modifier le code en tant que tel

gci $dirName | ?{ -not $_.PSIsContainer } | skip-count 1 | del

Le membre PSIsContainer est vrai que pour les dossiers.

Que diriez-vous:

dir $dirName | select -first ((dir $dirName).Length -1) | del

efface tout sauf le dernier.

Modifier Une version plus souple, plus vous ne devez entrer la commande dir deux fois:

$include=$False; dir $dirNam | where {$include; $include=$True;} | del

Remarque, cela ne le contraire, il supprime tout sauf la première. Il vous permet également d'ajouter des clauses, telles que de ne pas agir sur les répertoires:

$include=$False; dir $dirNam | where {$include -and $_.GetType() -ne [System.IO.DirectoryInfo]; $include=$True;} | del

Edit 2 en ce qui concerne l'exclusion des répertoires en utilisant la propriété Mode. Je suppose que cela devrait fonctionner à condition que le cadre ne change pas la façon dont la chaîne de mode est généré (je ne peux pas imaginer ce sera). Bien que je pourrais resserrer l'expression régulière à:

$_.Mode -notmatch "^d.{4}"

Si vous essayez d'éviter de taper, en ajoutant une fonction de votre profil est votre meilleur pari:

function isNotDir($file) { return $file.GetType() -ne [System.IO.DirectoryInfo];}
dir $dirName | where {isNotDir($_)}

Mon préféré:

move file to preserve elsewhere
delete all files
move preserved file back

del -Exclude. (Dir | sort CreationTime -desc) [0] -whatif

Ceci supprimera tous les fichiers sauf le dernier créé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top