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 -Recurse
をRemove-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
どんな提案でも大歓迎です。
遅いですが、誰かがこれが役に立つと思うかもしれません。
自動化スクリプトで、プロセスを再帰的に調べて、削除するディレクトリのパスを使用しているものを見つけ、それらを強制終了します。
時々他のアプリがファイルをロックしているかもしれないので、私はプロセスエクスプローラーを使ってハンドル/ 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
Remove-Item
コマンドレットによって与えられるエラーを検査できます。 Remote-Item
でErrorVariable
パラメータを使用してエラーを変数に保存し、ループして、必要なエラーのみを表示します。
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*' }
}
ファイルをロックしているのはWebアプリケーションなので、iisreset /stop
アイテムを削除する前に、次にiisreset /start
その後?
他の人が述べたように、IISがファイルをロックするのを防ぐことができます。この ブログ投稿 は、powershellを使用して単一のアプリプールをリサイクルする方法を説明しています。