PowerShell - il Più Compatto modo di “Eliminare tutti i file dalla cartella tranne uno”
-
05-09-2019 - |
Domanda
Che cosa è più compatta modo di eliminare tutti i file da una cartella salvo un file in uno script di PowerShell.Mi importa affatto che il file è tenuto, così come lungo come è tenuto.
Sto utilizzando PowerShell 2 CTP.
AGGIORNAMENTO:
Una fusione di tutte le risposte finora...
$fp = "\\SomeServer\SomeShare\SomeFolder"
gci $fp |where {$_.mode -notmatch "d"} |sort creationtime -desc |select -last ((@(gci $fp)).Length - 1) |del
C'è qualcuno che vede di eventuali problemi con questo?Come circa l'-notmatch parte?
Soluzione
In PS V2 abbiamo aggiunto -skip per selezionare in modo che si possa fare:
dir | dove {$ _ modalità -notmatch "d".} | selezionare -skip 1 | del
Altri suggerimenti
Senza alcun built-in funzioni è un po ' contorto perché le funzioni che necessitano di affrontare definitiva lunghezza.Ma è possibile farlo in questo modo, che consiste nel considerare la directory due volte
gci $dirName | select -last ((@(gci $dirName)).Length-1) | del
Ho scritto diverse estensioni powershell che fare i compiti come questo molto più facile.Un esempio è il Salto del Conte, il che consente un numero arbitrario di elementi per essere ignorato nella pipeline.Il codice può essere rapidamente cercato di guardare solo la directory in una sola volta
gci $dirName | skip-count 1 | del
Fonte di Saltare il Conteggio: http://blogs.msdn.com/jaredpar/archive/2009/01/13/linq-like-functions-for-powershell-skip-count.aspx
MODIFICA
In ordine di uccidere le cartelle, utilizzare "rm -ri-fo" invece di "canc"
EDIT2
Per evitare tutte le cartelle (vuote o non) è possibile modificare il codice in quanto tale
gci $dirName | ?{ -not $_.PSIsContainer } | skip-count 1 | del
Il PSISContainer membro è vero solo per le cartelle.
come su:
dir $dirName | select -first ((dir $dirName).Length -1) | del
elimina tutti, ma l'ultimo.
Modifica Una versione più flessibile, più non sarà necessario immettere il comando dir due volte:
$include=$False; dir $dirNam | where {$include; $include=$True;} | del
Nota, questo fa il contrario, cancella tutti tranne il primo. Esso permette anche di aggiungere clausole, come ad esempio di non agire sulla directory:
$include=$False; dir $dirNam | where {$include -and $_.GetType() -ne [System.IO.DirectoryInfo]; $include=$True;} | del
Modifica 2 per quanto riguarda esclusi directory utilizzando la proprietà Mode. Credo che dovrebbe funzionare a condizione che il quadro non cambia il modo in cui viene generata la stringa modalità (non riesco a immaginare che sarà). Anche se potrei stringere l'espressione regolare a:
$_.Mode -notmatch "^d.{4}"
Se si sta cercando di evitare la digitazione, l'aggiunta di una funzione per il tuo profilo è la soluzione migliore:
function isNotDir($file) { return $file.GetType() -ne [System.IO.DirectoryInfo];}
dir $dirName | where {isNotDir($_)}
Il mio preferito:
move file to preserve elsewhere
delete all files
move preserved file back
del -Exclude. (Dir | -desc sorta CreationTime) [0] -whatif
Questo cancellerà tutti i file tranne il creato più di recente.