PowerShell - forma más compacta de “Eliminar todos los archivos de esta carpeta excepto uno”

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

  •  05-09-2019
  •  | 
  •  

Pregunta

¿Cuál es la forma más compacta de eliminar todos los archivos de una carpeta excepto un archivo en un script de PowerShell. Yo no me importa en absoluto qué archivo se mantiene, con tal de que uno se mantiene.

Estoy usando el CTP de PowerShell 2.

ACTUALIZACIÓN:
Una amalgama de todas las respuestas hasta el momento ...

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

Alguien ve algún problema con el uso de este? ¿Qué hay de la parte -notmatch?

¿Fue útil?

Solución

En V2 PS añadimos -skip seleccionar por lo que podría hacer:

dir | donde {$ _ -notmatch modo "d".} | seleccionar -skip 1 | del

Otros consejos

Sin ningún tipo de funciones incorporadas en ella es un poco complicado porque las funciones neeed para hacer frente a la longitud definitiva. Pero usted puede hacerlo de esta manera, que consiste en examinar el directorio dos veces

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

he escrito varias extensiones de PowerShell que hacen este tipo de tareas mucho más fácil. Un ejemplo es Skip-Count que permite para un número arbitrario de elementos a ser omitidos en la tubería. Así que el código puede ser rápidamente buscó para que busque sólo en el directorio de una vez

gci $dirName | skip-count 1 | del

Fuente de Saltar-Count: http://blogs.msdn.com/jaredpar/archive/2009/01/13/linq-like-functions-for-powershell-skip-count.aspx

Editar

Con el fin de matar a carpetas utilice "rm -RE -fo" en lugar de "del"

Edit2

Con el fin de evitar todas las carpetas (vacío o no) puede modificar el código como tal

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

El miembro PSIsContainer sólo es cierto para las carpetas.

¿qué tal:

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

borra todos menos el último.

Editar Una versión más flexible, además de que no tendrá que introducir el comando dir dos veces:

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

Tenga en cuenta, esto lo contrario, borra todos menos el primero. También permite añadir cláusulas, como para no actuar en directorios:

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

Editar 2 con respecto a la exclusión de directorios utilizando la propiedad Mode. Supongo que debería funcionar siempre que el marco no cambia la forma en que se genera la cadena de modo (No me puedo imaginar lo hace). A pesar de que podría endurecer la expresión regular a:

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

Si usted está tratando de evitar tener que escribir, añadiendo una función de su perfil es su mejor apuesta:

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

Mi favorito:

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

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

Esto eliminará todos los archivos excepto el de más reciente creación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top