Я пытаюсь рекурсивно удалить каталог rm -Force -Recurse somedirectory
, получаю несколько ошибок «Каталог не пустой». Если я повторю ту же команду , она будет успешной.
Пример:
PS I:\Documents and Settings\m\My Documents\prg\net> rm -Force -Recurse .\FileHelpers
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data\RunTime\_svn: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (_svn:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data\RunTime: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (RunTime:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests\Data: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (Data:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\FileHelpers.Tests: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (FileHelpers.Tests:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs\nunit\_svn: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (_svn:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs\nunit: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (nunit:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers\Libs: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (Libs:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Remove-Item : Cannot remove item I:\Documents and Settings\m\My Documents\prg\net\FileHelpers: The directory is not empty.
At line:1 char:3
+ rm <<<< -Force -Recurse .\FileHelpers
+ CategoryInfo : WriteError: (I:\Documents an...net\FileHelpers:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
PS I:\Documents and Settings\m\My Documents\prg\net> rm -Force -Recurse .\FileHelpers
PS I:\Documents and Settings\m\My Documents\prg\net>
Конечно, это происходит не всегда . Кроме того, это происходит не только с _svn
каталогами, и у меня нет кеша TortoiseSVN или чего-то подобного, поэтому ничто не блокирует каталог.
Любые идеи?
источник
@JamesCW: проблема все еще существует в PowerShell 4.0
Я попытался другой обходной путь, и он работал: используйте cmd.exe:
источник
iisreset
перед удалением, и кажется, что ничего не работает надежно . Я попробую это, хотя, когда я впервые увидел это, я воздерживался от того, чтобы DOS был внутри моей Powershell ...rd /s
периодически тоже происходит сбой (хотя, по-видимому, реже, чемRemove-Item
): github.com/Microsoft/console/issues/309ETA 20181217: PSVersion 4.0 и более поздние версии по-прежнему не будут работать при некоторых обстоятельствах, см. Альтернативный ответ от Mehrdad Mirreza и отчет об ошибке, поданный mklement
mklement предоставляет решение Proof of Concept в этом ответе SO , поскольку ошибка ожидает официального исправления
Новая версия
PowerShell
(PSVersion 4.0
) полностью решила эту проблему иRemove-Item "targetdirectory" -Recurse -Force
работает без проблем с синхронизацией.Вы можете проверить свою версию, запустив
$PSVersiontable
изнутри ISE илиPowerShell
приглашение. 4.0 - это версия, поставляемая сWindows 8.1
иServer 2012 R2
, и она может быть установлена и в предыдущих версиях Windows.источник
rd
версию. Помимо фактической работы, это примерно в 3 раза быстрееrd /s
может случиться неудача реже, он тоже не работает - см. Этот отчет об ошибке .Обновление : По-видимому, планируется сделать API-интерфейсы удаления элементов файловой системы Windows синхронными, но они еще не синхронизированы с Windows 10 версии 1903 - см. Этот комментарий на GitHub .
Существующие ответы смягчают проблему, так что она возникает реже, но они не устраняют основную причину , поэтому сбои все еще могут возникать.
Remove-Item -Recurse
неожиданно асинхронный , в конечном счете, потому что методы Windows API для удаления файлов и каталогов по своей сути асинхронны иRemove-Item
не учитывают этого.Это периодически, непредсказуемо проявляется одним из двух способов:
Ваш случай: удаление непустого каталога само по себе может закончиться неудачей, если удаление подкаталога или файла в нем еще не завершено к тому времени, когда предпринята попытка удалить родительский каталог.
Реже: воссоздание удаленного каталога сразу после удаления может привести к сбою, поскольку удаление может быть еще не завершено к моменту повторного создания.
Проблема затрагивает не только PowerShell - х
Remove-Item
, но иcmd.exe
«Srd /s
, а также .NET - х[System.IO.Directory]::Delete()
:Начиная с Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.1 /
cmd.exe
10.0.17134.407 / .NET Framework 4.7.03056, .NET Core 2.1, ниRemove-Item
, ниrd /s
, ни[System.IO.Directory]::Delete()
надежно не работают , поскольку они не учитывают асинхронный поведение функций удаления файлов и каталогов Windows API :cmd.exe
отчет об ошибкеДля пользовательской функции PowerShell, которая обеспечивает надежно синхронный обходной путь , см. Этот ответ SO .
источник
while($true) { if ( (Remove-Item [...] *>&1) -ne $null) { Start-Sleep 0.5 } else { break } }
Текущий ответ на самом деле не удалит каталог, только его дочерние элементы. Кроме того, у него будут проблемы с вложенными каталогами, поскольку он снова будет пытаться удалить каталог перед его содержимым. Я написал что-то, чтобы удалить файлы в правильном порядке, все равно будет та же самая проблема, хотя иногда каталог все еще будет рядом.
Итак, теперь я использую что-то, что будет перехватывать исключение, ждать и повторять (3 раза):
Сейчас я использую это:
источник
Для удаления каталога и его содержимого требуется два шага. Сначала удалите содержимое, затем саму папку. Используя обходной путь для неисправного рекурсивного элемента удаления, решение будет выглядеть так:
Таким образом, вы также можете удалить родительский каталог.
источник
Remove-Item
вы подключаетесь, имеет ту же проблему, что и изначально. Он может наткнуться на элемент каталога, который не является пустым таким же образом.Remove-Item -Recurse
это все еще происходит. Основная проблема все еще существует в Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.1 - см. Этот отчет об ошибке .Гоша. Много ответов. Я честно предпочитаю это всем им. Это супер просто, полно, читабельно и работает на любом компьютере с Windows. Он использует .NET (надежную) функцию рекурсивного удаления, и если по какой-то причине происходит сбой, он генерирует правильное исключение, которое может быть обработано блоком try / catch.
Обратите внимание, что
Resolve-Path
строка важна, потому что .NET не знает ваш текущий каталог при разрешении относительных путей к файлам. Это единственное, что я могу придумать.источник
Это то, что у меня работает:
Эта первая строка удаляет все файлы в дереве. Вторая удаляет все папки, включая верхнюю.
источник
Remove-Item -Recurse
это все еще происходит. Основная проблема все еще существует в Windows PowerShell v5.1 / PowerShell Core 6.2.0-preview.1 - см. Этот отчет об ошибке .Получите право собственности на файлы / каталоги сначала с помощью Takeown.exe, затем удалите
https://learn-powershell.net/2014/06/24/changing-ownership-of-file-or-folder-using-powershell/
источник
У меня была эта проблема с каталогом, который не удалялся. Я обнаружил, что одна из подпапок была повреждена, и когда я попытался переместить или переименовать этот дочерний каталог, я получил сообщение об ошибке, в котором говорилось, что чего-то не хватает. Я попытался использовать rm -Force и получил ту же ошибку, что и вы.
Для меня работало сжатие родительского каталога с помощью 7-zip с включенной опцией «Удалить файлы после сжатия». После того, как он был сжат, я смог удалить zip-файл.
источник