Hapus windows.old dengan benar di Hyper-V Server 2012 R2

22

Saya telah menginstal Hyper-V Server 2012 R2 pada server yang memiliki Hyper-V Server 2012. Ketika saya melakukan ini, Windows.oldfolder standar dibuat. Saya sekarang ingin menghapus folder itu dengan aman. Cara standar untuk melakukan itu dengan GUI penuh adalah dengan menggunakan Disk Cleanup, tapi tentu saja saya tidak memiliki opsi itu di Hyper-V Server.

Apakah ada cara formal untuk menghapus folder itu dalam skenario ini? Saya tahu jika ini Server Core, saya dapat menginstal GUI lengkap termasuk Desktop Experience, tetapi itu akan menjadi omong kosong hanya untuk menghapus folder secara bersih.

Alasan utama saya untuk bertanya, bukan hanya melakukan rmdir /satau semacamnya, adalah bahwa Windows.oldfolder memiliki banyak persimpangan, dan saya tidak ingin merusak apa pun dalam salinan OS produksi sebagai bagian dari melakukan ini.

MikeBaz - MSFT
sumber
Saya membaca cleanmgr.exe dapat berjalan di baris perintah ... Tidak yakin apakah ini berlaku untuk server inti atau 2012 ???
john

Jawaban:

23

Saya pertama kali mencoba menyalin dan menjalankan cleanmgr.exe (Disk Cleanup tool), tetapi memiliki terlalu banyak dependensi pada DLL yang tidak ada di Core / Hyper-V Server.

Jadi alih-alih saya menghapus direktori secara manual.

Pertama saya menghapus semua titik persimpangan dan tautan simbolik. Untuk melakukan ini, saya menggunakan junction.exe dari SysInternals. Salin exe ke direktori di jalur Anda. Saya menjalankannya untuk mendapatkan daftar semua persimpangan:

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

Saya membuka PowerShell:

start powershell.exe

dan jalankan skrip berikut untuk menemukan baris yang relevan dan jalankan junction.exe lagi:

 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"
     }
 }

Ini menghapus semua titik persimpangan dan tautan simbolik tunggal di sistem saya.

kembali di cmd.exe Saya sekarang menjalankan tiga perintah untuk menghapus izin dan menghapus semua file:

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

Dalam pengujian saya, saya menginstal server Hyper-V 2012 baru, kemudian ditingkatkan ke 2012 R2, Windows.old sekarang hilang dan sistem berjalan dengan baik dengan semua target persimpangan lama utuh.

Peter Hahndorf
sumber
Apa isi dari junc.Txt? Bisakah Anda mempostingnya ke pastebin? Saya ingin tahu apakah ada sesuatu yang menarik yang dikaitkan.
longneck
pastebin.com/pYBGR4ap memiliki semua baris yang relevan dari junc.txt
Peter Hahndorf
Tampaknya ini berhasil, terima kasih! Saya juga sekarang tahu takeownada, yang saya sedikit malu untuk mengakui bahwa saya tidak tahu.
MikeBaz - MSFT
1
Mengapa seseorang harus menghapus titik persimpangan secara manual sebelum menghapus folder? Titik persimpangan disimpan dalam sistem file, jadi pasti akan dihapus bersama dengan folder ...?
Ashley
3
@AshleySteel - Karena ketika menjaga persimpangan, perintah seperti takeown gagal. Inilah kesalahannya: INFO: Sistem tidak dapat menemukan jalur yang ditentukan. ("C: \ windows.old \ Dokumen dan Pengaturan \ Semua Pengguna \ Data Aplikasi \ Data Aplikasi \ Data Aplikasi \ Data Aplikasi \ Data Aplikasi \ Data Aplikasi \ Data Aplikasi \ Data Aplikasi \ Data \ Microsoft \ Windows \ SystemData \ S-1-5-18 \ ReadOnly ") ERROR: Nama file, nama direktori, atau sintaks label volume salah. - Ini terlihat seperti masalah rekursi bagi saya dan berhenti ketika jalur file terlalu panjang.
Peter Hahndorf
4

Saya menggunakan jawaban Peter H dan mengkonfirmasikan bahwa itu berfungsi, namun saya perlu melakukan ini pada beberapa server, jadi saya memodifikasi kodenya menjadi skrip PowerShell yang dapat dieksekusi baik secara lokal atau melalui PS remoting dari komputer lain. Ini adalah file .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
SukaARock47
sumber
Yap yang ini berfungsi memperlakukan. Jangan lupa untuk meningkatkan hak istimewa powershell.exe ("Run As Administrator")
Nexus
Baris: echo y | cacls C: \ windows.old / T / G Semua orang: F Seharusnya: echo y | cacls C: \ windows.old / T / G Semua orang: F Tidak ada spasi antara <kbd> y </kbd> dan <kbd> | </kbd>
user437960