web-dev-qa-db-ja.com

Remove-Item PowerShellエラー「プロセスがファイルにアクセスできない」を回避する方法は?

TfsDeployer とPowerShellスクリプトを使用して、新しいバージョンをデプロイする前にRemove-Itemを使用してフォルダーを削除しています。 PSスクリプトが次のエラーで失敗することがあります。

Remove-Item:アイテムを削除できませんServices\bin:別のプロシージャGet-ChildItem -Path $ Destination -Recurseによって使用されているため、プロセスはファイルServices\binにアクセスできません| Remove-Item <<<< -force -recurse + CategoryInfo:WriteError:(C:\ Program File ..\Services\bin:DirectoryInfo)[Remove-Item]、IOException FullyQualifiedErrorId:RemoveFileSystemItemIOError、Microsoft.PowerShell.Commands.RemoveItemCommand

Get-ChildItem -RecurseRemove-Itemにパイプ接続するために answer (from: PowerShellのForce-removeファイルとディレクトリが時々失敗しますが、常にではない )を試してみました。

Get-ChildItem * -Include *.csv -Recurse | Remove-Item

しかし、エラーはまだ定期的に発生します。ロックアプリケーションを手動で強制終了するために nlocker を使用しています(通常はw3wpです)が、自動化された解決策を見つけることを好みます。

別の(理想的ではない)オプションは to-suppress-powershell-errors です。

 Get-ChildItem -Recurse -Force -ErrorAction SilentlyContinue

どんな提案でも大歓迎です。

6

遅いですが、誰かがこれが役に立つと思うかもしれません。

自動化スクリプトで、プロセスを再帰的に調べて、削除するディレクトリのパスを使用しているものを見つけ、それらを強制終了します。

時々他のアプリがファイルをロックしているかもしれないので、私はプロセスエクスプローラーを使ってハンドル/ dllを見つけました。アプリを強制終了してもよい場合は、スクリプトに強制終了を追加します。

次に、dirを削除します。

        get-process | foreach{
          $pName = $_
          if ( $pName.Path -like ( $INSTALL_PATH + '*') ) {
            Stop-Process $pName.id -Force -ErrorAction SilentlyContinue
          }
        }
       Remove-Item  -Force -Recurse $INSTALL_PATH
1
jessarah

Remove-Itemコマンドレットによって与えられるエラーを検査できます。 Remote-ItemErrorVariableパラメータを使用してエラーを変数に保存し、ループして、必要なエラーのみを表示します。

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*' }
}
1
splattered bits

ファイルをロックしているのはWebアプリケーションなので、iisreset /stopアイテムを削除する前に、次にiisreset /startその後?

0
Dominic Cronin

他の人が述べたように、IISがファイルをロックするのを防ぐことができます。この ブログ投稿 は、powershellを使用して単一のアプリプールをリサイクルする方法を説明しています。

0
eugenesqr