PowerShell - Most Compact maneira de “Excluir todos os arquivos desta pasta, exceto um”

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

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top