PowerShell - il Più Compatto modo di “Eliminare tutti i file dalla cartella tranne uno”

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

  •  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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top