Правильно видаліть windows.old на Hyper-V Server 2012 R2


22

Я встановив Hyper-V Server 2012 R2 на сервер, на якому був Hyper-V Server 2012. Коли я це зробив, Windows.oldбула створена стандартна папка. Тепер я хотів би безпечно видалити цю папку. Стандартний спосіб зробити це з повним графічним графічним інтерфейсом - використовувати очищення диска, але, звичайно, у мене немає такої можливості на сервері Hyper-V.

Чи існує формальний спосіб видалити цю папку в цьому сценарії? Я знаю, що це сервер Core, я міг би встановити повний графічний інтерфейс, включаючи досвід роботи на робочому столі, але це було б багато дурниць лише для чистого видалення папки.

Моя головна причина запитання, на відміну від просто того rmdir /sчи іншого подібного, полягає в тому, що в Windows.oldпапці є багато стиків, і я не хочу нічого порушувати у виробничій копії ОС, як частину цього.


Я прочитав cleanmgr.exe може працювати в командному рядку ... Не впевнений, чи стосується ядра сервера або 2012 року ???
Джон

Відповіді:


23

Я спершу спробував скопіювати та запустити cleanmgr.exe (інструмент очищення диска), але у нього занадто багато залежностей від DLL-файлів, яких немає у сервері Core / Hyper-V.

Тому замість цього я видалив каталог вручну.

Спочатку я видалив усі точки з'єднання та символічні посилання. Для цього я використав 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 тепер відсутній, і система працює нормально, коли всі старі цілі з'єднання недоторкані.


Який був вміст junc.Txt? Чи можете ви розмістити його на пастібіні? Мені цікаво, якщо щось цікаве було пов’язане.
longneck

pastebin.com/pYBGR4ap має всі відповідні рядки від junc.txt
Пітер

Здається, це добре працювало, дякую! Я також тепер знаю takeown, що існує, про що мені трохи соромно визнати, що я не знав про це.
MikeBaz - MSFT

1
Чому потрібно видалити точки з'єднання вручну перед видаленням папки? Точки стику зберігаються у файловій системі, тож, безумовно, видаляються разом із папкою ...?
Ешлі

3
@AshleySteel - Тому що при збереженні з'єднань такі команди, як поглинання, виходять з ладу. Ось помилка: INFO: Система не може знайти вказаний шлях. ("C: \ windows.old \ Документи та налаштування \ Усі користувачі \ Дані програми \ Дані програми \ Дані програми \ Дані програми \ Дані програми \ Дані програми \ Дані програми \ Дані програми \ Дані програми \ Дані програми \ Дані програми \ Microsoft \ Windows \" ПОМИЛКА SystemData \ S-1-5-18 \ ReadOnly "): Ім'я файлу, ім'я каталогу або синтаксис міток тома невірно. - це виглядає як проблема з рекурсією, і вона зупиняється, коли шлях файлу стає занадто довгим.
Пітер Гандорф

4

Я використав відповідь Пітера Н і підтвердив, що він працює, однак мені потрібно було це зробити на декількох серверах, тому я змінив його код на скрипт, який можна виконати локально або через 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

Так, цей працює частуванням. Не забудьте підняти privilegell.exe привілеї ("Запустити як адміністратор")
Nexus

Рядок: відлуння у | cacls C: \ windows.old / T / G Кожен: F Повинен бути: відлуння у | cacls C: \ windows.old / T / G Для всіх: F Немає місця між <kbd> y </kbd> та <kbd> | </kbd>
user437960
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.