PowerShell - forma más compacta de “Eliminar todos los archivos de esta carpeta excepto uno”
-
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?
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.