Назад | Перейти на главную страницу

Правильно удалите 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 папка имеет много стыков, и я не хочу ничего ломать в производственной копии ОС при этом.

Сначала я попытался скопировать и запустить 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