Не могу удалить определенные папки с помощью powershell

У меня проблема, когда я хочу удалить папки профиля на сетевом ресурсе. Кажется, есть проблема с некоторыми папками, которые нельзя удалить.

Вот код, который отлично работает в большинстве папок:

Import-Module -Name 'C:\Users\mkz\Documents\powershell\modules\AlphaFS.2.1.3.0\Lib\Net452\AlphaFS.dll'

$folder = "\\filsrvm\MDrev\folderName"

#Function to take ownership and grant permissions
function takeOwnership($path)
{
    if(Test-Path $path)
    {
        $server = ($path).Split("\\",5)[2]+".adm.domain.dk"
        takeown.exe /S $server /F $path /r /d Y
        icacls $path /grant 'GroupAdm_GL:(CI)(OI)F' /t /c /q
        icacls "$path\*" /reset /t /c /q
    }
}

#Function to delete folders
function deleteFolder($path)
{

    if(Test-Path $path)
    {
        [Alphaleonis.Win32.Filesystem.Directory]::Delete($path, $true, $true)
    }

}

takeOwnership($folder)
deleteFolder($folder)

Я получаю следующую ошибку:

<red>Exception calling "Delete" with "3" argument(s): "(145) The directory is not empty: [\\?\UNC\filsrvm\MDrev\folderName\Ctx]"
At C:\Users\mkz\Documents\powershell\singleDelete.ps1:24 char:9
+         [Alphaleonis.Win32.Filesystem.Directory]::Delete($path, $true ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DirectoryNotEmptyException</red>

Я пытался использовать Remove-Item $path -force -Recurse вместо "Alphaleonis", но это приводит к той же ошибке.


person Michael Kirkegaard    schedule 19.06.2018    source источник


Ответы (1)


Я не нашел способа сделать это изначально в PowerShell. Это решение сработало для меня на Windows Server 2012 R2. Это примерно переводится на PS как:

$pathToDelete = "TROUBLESOME_PATH_ROOT"
$tmpDir = [System.IO.Path]::GetRandomFileName()
mkdir $tmpDir
& robocopy.exe /S /MIR $tmpDir "$pathToDelete"
rmdir $tmpDir
rmdir "$pathToDelete"

Это рекурсивно отображает пустой каталог в целевой каталог, эффективно удаляя его.

См. также Как удалить каталоги со слишком длинными путями/именами для обычного удаления .

person Robert Mooney    schedule 20.06.2018
comment
Я пробовал, но получаю ошибку. rmdir : Parts of the path '\\filsrvm\filepath\to\remove' wasnt found. - person Michael Kirkegaard; 22.06.2018
comment
Похоже, RoboCopy успешно завершен. Возможно, вам придется запускать его более одного раза по ссылкам, которые я привел, хотя я сам с этим не сталкивался. Остались ли файлы в $pathToDelete? - person Robert Mooney; 22.06.2018
comment
извините за поздний ответ, но да, в $pathToDelete еще остались файлы. Я пытался запустить его более одного раза, и ничего не работает. Когда я запускаю robocopy после того, как я стал владельцем, я получаю следующую ошибку: 2018/07/17 08:18:52 ERROR 2 (0x00000002) Deleting Extra Directory \\folder\to\delete The specified file was not found. - person Michael Kirkegaard; 17.07.2018
comment
Что, если вы заключите в кавычки параметры $pathToDelete выше? - person Robert Mooney; 17.07.2018
comment
Вы имеете в виду переменную примерно так: $pathToDelete ? В чем разница? - person Michael Kirkegaard; 17.07.2018
comment
Насколько я помню, rmdir унаследован от DOS и не предназначен для работы с URL или сетевым путем. \\filsrvm\filepath\to\remove следует писать как z:\to\remove , конечно, после того, как вы вызвали сетевое использование, то есть сетевое использование \\filsrvm\filepath z: это также полезно для сокращения пути, поскольку может случиться так, что команда не будет выполнена из-за чрезмерной длины идентификационного имени файла или папки. - person A. Lion; 30.08.2018