PowerShell Remove Junction

Начиная с Windows 10 PowerShell, наконец, способен создавать соединения и ссылки собственными силами.

Однако функция Remove-Item, похоже, не знает о соединении и пытается удалить каталог, запрашивая подтверждение, и если он должен рекурсивно удалять элементы внутри.

Итак, вопрос: есть ли способ удалить соединение, используя собственные командлеты PowerShell? (т.е. без вызова cmd)

5 ответов

Решение

Есть ли способ удалить соединение с помощью PowerShell?

В настоящее время, по крайней мере в PowerShell v5, это считается "исправленным". Что вы можете сделать, это использовать -Force переключатель, в противном случае вы получите ошибку при вызове пути к соединению NTFS. Причина, по которой я, по крайней мере, использую кавычки на фиксированном, заключается в том, что при использовании переключателя все равно появится сообщение о дочерних элементах в каталоге. Выбор Y все равно удалит только соединение в моем тестировании с использованием PSv5.

Remove-Item "C:\temp\junction" -Force -Confirm:$False

Если это не работает для вас, или у вас нет v5, вы можете использовать метод.Net для удаления каталога. Похоже, это работает правильно.

[io.directory]::Delete("C:\temp\junction")

Попробуйте эту команду-let:

cmd /c rmdir .\Target

источник: Powershell Remove-Item и символические ссылки

Я знаю, что этот пост старый, но для тех, кто изучает его в 2023 году, вы можете использовать следующую комбинацию командлетов PS, чтобы удалить соединение, но не его содержимое:

      $junction = Get-Item -Path <path_to_junction>
$junction.Delete()

Этот путь является фактическим путем соединения, а не родительским путем.

Это можно свести к:

      (gi <path>).Delete()

Простая команда -

rm [path of file] -Force

После долгого поиска в Google я нашел ответ:

function Remove-Any-File-Force ($Target) {
    if ( Test-Path -Path "$Target" ){
        & $env:SystemRoot\System32\ATTRIB.exe -S -H -R "$Target" >$null 2>$null
    } else {
        return
    }
    $TargetAttributes = (Get-Item -Path $Target -Force).Attributes.ToString()
    if ($TargetAttributes -match "ReparsePoint") {
        if ($TargetAttributes -match "Archive") {
            Remove-Item -Path "$Target" -Force
        } else {
            try {
                & $env:SystemRoot\System32\cmd.exe /c rmdir /Q "$Target" >$null 2>$null
            } catch {
                try {
                    [io.directory]::Delete("$Target")
                } catch {
                    Remove-Item -Path "$Target" -Force
                }
            }
        }    
    } else {
        if ($TargetAttributes -match "Directory") {
            Remove-Item -Path "$Target" -Force -Recurse
        } else {
            Remove-Item -Path "$Target" -Force
        }
    }
}
Другие вопросы по тегам