PowerShell - Most Compact maneira de “Excluir todos os arquivos desta pasta, exceto um”
-
05-09-2019 - |
Pergunta
O que é a forma mais compacta de apagar todos os arquivos de uma pasta , exceto um arquivo em um script PowerShell. Eu não importa em tudo que arquivo é mantido, apenas enquanto um é mantido.
Eu estou usando o PowerShell 2 CTP.
UPDATE:
Uma amálgama de todas as respostas até agora ...
$fp = "\\SomeServer\SomeShare\SomeFolder"
gci $fp |where {$_.mode -notmatch "d"} |sort creationtime -desc |select -last ((@(gci $fp)).Length - 1) |del
Alguém viu problemas com o uso isso? Como sobre a parte -notmatch?
Solução
No PS V2 adicionamos -skip selecionar assim que você poderia fazer:
dir | where {$ _ modo -notmatch "d".} | selecionar -skip 1 | del
Outras dicas
Sem qualquer built-in funções é um pouco complicado porque as funções neeed para lidar com comprimento definitivo. Mas você pode fazê-lo desta forma, que envolve olhar para o diretório duas vezes
gci $dirName | select -last ((@(gci $dirName)).Length-1) | del
Eu escrevi várias extensões PowerShell que fazem tarefas como este muito mais fácil. Um exemplo é Ir-Count que permite a um número arbitrário de elementos a serem ignorados no pipeline. Assim, o código pode ser rapidamente procurou olhar apenas para o diretório uma vez
gci $dirName | skip-count 1 | del
Fonte Para pular-Count: http://blogs.msdn.com/jaredpar/archive/2009/01/13/linq-like-functions-for-powershell-skip-count.aspx
Editar
A fim de matar pastas usar "rm -re -fo" em vez de "del"
EDIT2
A fim de evitar todas as pastas (vazio ou não), você pode modificar o código como tal
gci $dirName | ?{ -not $_.PSIsContainer } | skip-count 1 | del
O membro PSIsContainer só é verdade para pastas.
como sobre: ??
dir $dirName | select -first ((dir $dirName).Length -1) | del
exclui tudo, exceto a última.
Editar: Uma versão mais flexível, mais você não terá que digitar o comando dir duas vezes:
$include=$False; dir $dirNam | where {$include; $include=$True;} | del
Note, isso não o contrário, ele exclui todos, mas o primeiro. Ele também permite que você adicione cláusulas, como não agir em diretórios:
$include=$False; dir $dirNam | where {$include -and $_.GetType() -ne [System.IO.DirectoryInfo]; $include=$True;} | del
Editar 2 no que diz respeito à exclusão de diretórios usando a propriedade Mode. Eu acho que deve funcionar, desde que o quadro não mudar a forma como a corda modo é gerado (Eu não posso imaginar que vai). Embora eu poderia apertar a expressão regular para:
$_.Mode -notmatch "^d.{4}"
Se você está tentando digitação evitar, adicionando uma função para o seu perfil é a sua melhor aposta:
function isNotDir($file) { return $file.GetType() -ne [System.IO.DirectoryInfo];}
dir $dirName | where {isNotDir($_)}
O meu favorito:
move file to preserve elsewhere
delete all files
move preserved file back
del -Exclude. (Dir | -desc tipo CreationTime) [0] -whatif
Isto irá apagar todos os arquivos, exceto o mais recentemente criada.