Como evitar erros do PowerShell de Remove-Item “o processo não pode acessar o arquivo”?

3

Estamos usando o TfsDeployer e o script do PowerShell para remover as pastas ising Remove-Item antes da implantação de uma nova versão. Às vezes, o script PS falhou com o erro

Remove-Item : Cannot remove item Services\bin: The process cannot access the file Services\bin' because it is being used by another proc Get-ChildItem -Path $Destination -Recurse | Remove-Item <<<< -force -recurse + CategoryInfo : WriteError: (C:\Program File..\Services\bin:DirectoryInfo) [Remove-Item], IOException FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand

Eu tentei seguir a resposta de Force-remover arquivos e diretórios em PowerShell falhar algumas vezes, mas nem sempre para tubo de obter-childitem -recurse em remove-item

get-childitem * -include * .csv -recurse | remove-item

, mas o erro ainda acontece periodicamente. Estamos usando unlocker para matar manualmente pedido de bloqueio, (é geralmente w3wp), mas eu prefiro a encontrar solução automatizada.

Outra opção (não ideal) é para suprimir os erros do powershell      get-childitem -recurse -force -erroraction silenciosamentecontinuar

Todas as sugestões são bem vindas.

    
por Michael Freidgeim 11.02.2012 / 00:04

4 respostas

1

Você pode inspecionar os erros fornecidos pelo cmdlet Remove-Item . Use o parâmetro ErrorVariable em Remote-Item para armazenar seus erros em uma variável e, em seguida, percorra-os, exibindo apenas os erros desejados.

Get-ChildItem * -Include *.csv -recurse | ForEach-Object {
    $removeErrors = @()
    $_ | Remove-Item -ErrorAction SilentlyContinue -ErrorVariable removeErrors
    $removeErrors | where-object { $_.Exception.Message -notlike '*it is being used by another process*' }
}
    
por 01.08.2013 / 22:28
1

Tarde, mas alguém pode achar isso útil.

Em um script de automação, eu recursei através de processos para encontrar qualquer um que estivesse usando o caminho do diretório que eu queria apagar, e os matei.

Às vezes, outros aplicativos podem estar bloqueando um arquivo, então usei o Process Explorer para encontrar o handle / dll. Se estiver ok para matar o aplicativo, eu adiciono o kill ao script.

Em seguida, remova o diretório

        get-process | foreach{
        $pName = $_
        if ( $pName.Path -like ( $INSTALL_PATH + '*') ) {
            Stop-Process $pName.id -Force -ErrorAction SilentlyContinue
        }
       Remove-Item  -Force -Recurse $INSTALL_PATH
    
por 18.06.2015 / 13:32
0

Bem, como é um aplicativo da Web que está bloqueando o arquivo, por que você não faz um iisreset /stop antes de remover o item e depois iisreset /start depois?

    
por 06.08.2012 / 17:20
0

Como outros usuários mencionaram, você pode impedir que o IIS bloqueie os arquivos. Esta postagem do blog descreve como reciclar conjunto de aplicativos únicos usando o powershell.

    
por 23.01.2014 / 07:46