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
Я знаю, что этот пост старый, но для тех, кто изучает его в 2023 году, вы можете использовать следующую комбинацию командлетов PS, чтобы удалить соединение, но не его содержимое:
$junction = Get-Item -Path <path_to_junction>
$junction.Delete()
Этот путь является фактическим путем соединения, а не родительским путем.
Это можно свести к:
(gi <path>).Delete()
После долгого поиска в 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
}
}
}