Gỡ bỏ đúng cách windows.old trên Hyper-V Server 2012 R2


22

Tôi đã cài đặt Hyper-V Server 2012 R2 trên một máy chủ có Hyper-V Server 2012. Khi tôi làm điều này, Windows.oldthư mục tiêu chuẩn đã được tạo. Bây giờ tôi muốn xóa thư mục đó một cách an toàn. Cách tiêu chuẩn để làm điều đó với GUI đầy đủ sẽ là sử dụng Disk Cleanup, nhưng tất nhiên tôi không có tùy chọn đó trên Hyper-V Server.

Có một cách chính thức để loại bỏ thư mục đó trong kịch bản này? Tôi biết nếu đây là Server Core, tôi có thể cài đặt GUI đầy đủ bao gồm cả Trải nghiệm trên máy tính để bàn, nhưng điều đó sẽ vô nghĩa chỉ khi xóa sạch một thư mục.

Lý do chính của tôi để hỏi, trái ngược với chỉ làm rmdir /shoặc một số thứ như vậy, là Windows.oldthư mục có rất nhiều mối nối và tôi không muốn phá vỡ bất cứ điều gì trong bản sao hệ điều hành sản xuất như là một phần của việc này.


Tôi đọc Cleanmgr.exe có thể chạy trong dòng lệnh ... Không chắc điều này áp dụng cho lõi máy chủ hay 2012 ???
john

Câu trả lời:


23

Lần đầu tiên tôi đã cố gắng sao chép và chạy Cleanmgr.exe (công cụ Disk Cleanup), nhưng nó có quá nhiều phụ thuộc vào DLL không có trong Core / Hyper-V Server.

Vì vậy, thay vào đó tôi xóa thư mục bằng tay.

Đầu tiên tôi loại bỏ tất cả các điểm giao nhau và các liên kết tượng trưng. Để thực hiện điều tôi đã sử dụng này junction.exe từ SysInternals. Sao chép exe vào một thư mục trong đường dẫn của bạn. Tôi chạy nó để có được một danh sách tất cả các mối nối:

c:\tools\junction.exe -s -q C:\windows.old > %temp%\junc.txt

Tôi đã mở PowerShell:

start powershell.exe

và chạy đoạn mã sau để tìm các dòng có liên quan và thực hiện lại jeft.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"
     }
 }

Điều này đã loại bỏ tất cả các điểm giao nhau và liên kết tượng trưng duy nhất trên hệ thống của tôi.

trở lại cmd.exe Bây giờ tôi đã thực thi ba lệnh để xóa quyền và xóa tất cả các tệp:

 takeown /F C:\windows.old /R /D Y
 cacls C:\windows.old /T /G Everyone:F
 rd /s /q C:\windows.old

Trong thử nghiệm của mình, tôi đã cài đặt một máy chủ Hyper-V mới 2012, sau đó nâng cấp lên 2012 R2, Windows.old đã biến mất và hệ thống vẫn hoạt động tốt với tất cả các mục tiêu tiếp giáp cũ còn nguyên vẹn.


Nội dung của junc.Txt là gì? Bạn có thể đăng nó lên pastebin? Tôi tò mò nếu bất cứ điều gì quan tâm được liên kết.
longneck

pastebin.com/pYBGR4ap có tất cả các dòng có liên quan từ junc.txt
Peter Hahndorf

Điều này dường như đã làm việc tốt, cảm ơn! Bây giờ tôi cũng biết takeowntồn tại, điều mà tôi hơi xấu hổ khi thừa nhận mình không biết.
MikeBaz - MSFT

1
Tại sao người ta cần phải xóa thủ công các điểm giao nhau trước khi xóa thư mục? Các điểm giao nhau được lưu trữ trong hệ thống tập tin, vì vậy chắc chắn sẽ bị xóa cùng với thư mục ...?
Ashley

3
@AshleySteel - Bởi vì khi giữ các nút giao, các lệnh như Takeown thất bại. Đây là lỗi: INFO: Hệ thống không thể tìm thấy đường dẫn được chỉ định. ("C: \ windows.old \ Documents and Settings \ All Users \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Microsoft \ Windows \ SystemData \ S-1-5-18 \ ReadOnly ") LRI: Tên tệp, tên thư mục hoặc cú pháp nhãn âm lượng không chính xác. - điều này có vẻ như là một vấn đề đệ quy với tôi và nó dừng lại khi đường dẫn tệp quá dài.
Peter Hahndorf

4

Tôi đã sử dụng câu trả lời của Peter H và xác nhận rằng nó hoạt động, tuy nhiên tôi cần phải làm điều này trên nhiều máy chủ, vì vậy tôi đã sửa đổi mã của anh ấy thành một tập lệnh powershell có thể được thực thi cục bộ hoặc thông qua PS từ xa từ một máy khác. Đây là tệp .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

Yep cái này hoạt động một điều trị. Đừng quên nâng cao đặc quyền powershell.exe ("Chạy với tư cách quản trị viên")
Nexus

Dòng: echo y | cacls C: \ windows.old / T / G Mọi người: F Nên là: echo y | cacls C: \ windows.old / T / G Mọi người: F Không có khoảng cách giữa <kbd> y </ kbd> và <kbd> | </ kbd>
user437960
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.