Правильно удалите windows.old на Hyper-V Server 2012 R2
Я установил Hyper-V Server 2012 R2 на сервер, на котором был Hyper-V Server 2012. Когда я это сделал, стандарт Windows.old
папка была создана. Теперь я хотел бы безопасно удалить эту папку. Стандартный способ сделать это с полным графическим интерфейсом - использовать очистку диска, но, конечно, у меня нет такой опции на сервере Hyper-V.
Есть ли формальный способ удалить эту папку в этом сценарии? Я знаю, что если бы это было Server Core, я мог бы установить полный графический интерфейс пользователя, включая Desktop Experience, но это было бы большой ерундой только для чистого удаления папки.
Моя основная причина спрашивать, а не просто делать rmdir /s
или что-то такое, что Windows.old
папка имеет много соединений, и я не хочу ничего ломать в производственной копии ОС, как часть этого.
2 ответа
Сначала я попытался скопировать и запустить cleanmgr.exe (инструмент очистки диска), но у него слишком много зависимостей от библиотек DLL, которых нет в Core/Hyper-V Server.
Поэтому вместо этого я удалил каталог вручную.
Сначала я удалил все точки соединения и символические ссылки. Для этого я использовал junction.exe из SysInternals. Скопируйте исполняемый файл в каталог по вашему пути. Я запустил его, чтобы получить список всех соединений:
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