Я установил Hyper-V Server 2012 R2 на сервере с Hyper-V Server 2012. Когда я это сделал, стандартный Windows.old
папка создана. Теперь я хотел бы безопасно удалить эту папку. Стандартный способ сделать это с полным графическим интерфейсом - использовать очистку диска, но, конечно, у меня нет такой возможности на сервере Hyper-V.
Есть ли формальный способ удалить эту папку в этом сценарии? Я знаю, что если бы это было Server Core, я мог бы установить полный графический интерфейс, включая Desktop Experience, но это было бы чепухой, просто чтобы чисто удалить папку.
Моя основная причина спрашивать, а не просто делать rmdir /s
или что-то подобное, заключается в том, что Windows.old
папка имеет много стыков, и я не хочу ничего ломать в производственной копии ОС при этом.
Сначала я попытался скопировать и запустить cleanmgr.exe (инструмент очистки диска), но у него слишком много зависимостей от библиотек DLL, которых нет в Core / Hyper-V Server.
Поэтому вместо этого я удалил каталог вручную.
Сначала я удалил все точки соединения и символические ссылки. Для этого я использовал junction.exe из SysInternals. Скопируйте exe в каталог на своем пути. Я запустил его, чтобы получить список всех перекрестков:
c:\tools\junction.exe -s -q C:\windows.old > %temp%\junc.txt
Я открыл PowerShell:
start powershell.exe
и запустил следующий сценарий, чтобы найти соответствующие строки и снова запустить junction.exe:
foreach ($line in [System.IO.File]::ReadLines("$env:temp\junc.txt"))
{
if ($line -match "^\\\\")
{
$file = $line -replace "(: JUNCTION)|(: SYMBOLIC LINK)",""
& c:\tools\junction.exe -d "$file"
}
}
Это удалило все точки соединения и единственную символическую ссылку в моей системе.
вернувшись в cmd.exe, я выполнил три команды, чтобы очистить разрешения и удалить все файлы:
takeown /F C:\windows.old /R /D Y
cacls C:\windows.old /T /G Everyone:F
rd /s /q C:\windows.old
В своем тесте я установил новый сервер Hyper-V 2012, затем обновил его до 2012 R2, Windows.old теперь нет, и система работает нормально со всеми старыми целевыми точками соединения.
Я использовал ответ Питера Х и подтвердил, что он действительно работает, однако мне нужно было сделать это на нескольких серверах, поэтому я изменил его код на сценарий PowerShell, который можно запускать либо локально, либо через удаленное взаимодействие PS с другой машины. Это файл .ps1:
# Script to remove windows.old after an upgrade
# Assumes path to sysinternals is in the PATH env variable
$ErrorActionPreference = "Inquire"
junction.exe -accepteula -s -q C:\windows.old | out-file $env:temp\juncts.txt -force
foreach ($line in [System.IO.File]::ReadLines("$env:temp\juncts.txt"))
{
if ($line -match "^\\\\")
{
$file = $line -replace "(: JUNCTION)|(: SYMBOLIC LINK)",""
& junction.exe -d "$file"
}
}
takeown /F C:\windows.old /R /D Y
echo y | cacls C:\windows.old /T /G Everyone:F
rm C:\windows.old -recurse -force
rm "$env:temp\juncts.txt" -force