Hyper-V Server 2012 R2'deki windows.old'u doğru şekilde kaldırın


22

Hyper-V Server 2012 R2'yi Hyper-V Server 2012'ye sahip bir sunucuya kurdum. Bunu yaptığımda standart Windows.oldklasör oluşturuldu. Şimdi bu klasörü güvenle kaldırmak istiyorum. Bunu tam bir GUI ile yapmanın standart yolu Disk Temizleme kullanmak olacaktır, ancak elbette Hyper-V Server'da bu seçeneğim yok.

Bu senaryoda bu klasörü kaldırmanın resmi bir yolu var mı? Bunun Sunucu Çekirdeği olup olmadığını Masaüstü Deneyimi de dahil olmak üzere tam GUI'yi yükleyebildiğimi biliyorum, ancak bu sadece bir klasörü temiz bir şekilde kaldırmak çok saçma olurdu.

Sormak için temel nedenim, sadece rmdir /sya da bazılarının aksine , Windows.oldklasörün çok fazla kavşağa sahip olması ve üretim işletim sistemi kopyasında bunun bir parçası olarak hiçbir şeyi kırmak istemiyorum.


Cleanmgr.exe komut satırında çalıştırabilirsiniz okumak ... Bunun sunucu çekirdeği veya 2012 için geçerli olup olmadığından emin değil misiniz ???
john

Yanıtlar:


23

Öncelikle cleanmgr.exe (Disk Temizleme aracı) kopyalayıp çalıştırmayı denedim, ancak Core / Hyper-V Server'da bulunmayan DLL dosyalarına çok fazla bağımlılık var.

Bunun yerine dizini elle sildim.

Önce tüm bağlantı noktalarını ve sembolik bağları kaldırdım. Bunu yapmak için SysInternals'tan junction.exe aracını kullandım. Exe'i yolunuzdaki bir dizine kopyalayın. Tüm kavşakların bir listesini almak için koştum:

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

PowerShell'i açtım:

start powershell.exe

ve ilgili betiği bulmak ve junction.exe dosyasını tekrar çalıştırmak için aşağıdaki betiği çalıştırın:

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

Bu, tüm bağlantı noktalarını ve sistemimdeki tek sembolik bağlantıyı kaldırdı.

cmd.exe dosyasına geri döndüm Şimdi izinleri silmek ve tüm dosyaları silmek için üç komut kullandım:

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

Testimde yeni bir Hyper-V sunucusu 2012 kurdum, sonra 2012 R2'ye yükselttim, Windows.old artık gitti ve sistem bütün eski kavşak hedefleri bozulmadan çalışıyor.


Junc.Txt içeriği neydi? Pastebin'e gönderebilir misin? İlgilendiğim herhangi bir şeyin bağlantılı olup olmadığını merak ediyorum.
Longneck

pastebin.com/pYBGR4ap junc.txt tüm ilgili satırları vardır
Peter HAHNDORF

Bu iyi çalıştı gibi görünüyor, teşekkürler! Ayrıca şimdi de biliyorum takeown, ki bilmediğimi itiraf etmekten biraz utanıyorum.
MikeBaz - MSFT

1
Klasörü silmeden önce neden bağlantı noktalarının el ile kaldırılması gerekiyor? Birleşim noktaları dosya sisteminde saklanır, bu yüzden kesinlikle ... klasörüyle birlikte silinir mi?
Ashley

3
@AshleySteel - Çünkü kavşakları tutarken, alma gibi komutlar başarısız olur. İşte hata: INFO: Sistem belirtilen yolu bulamıyor. ("C: \ windows.old \ Documents and Settings \ Tüm Kullanıcılar \ Uygulama Verileri \ Uygulama Verileri \ Uygulama Verileri \ Uygulama Verileri \ Uygulama Verileri \ Uygulama Verileri \ Uygulama Verileri \ Uygulama Verileri \ Uygulama Verileri \ Uygulama Verileri \ Uygulama Verileri \ Microsoft \ Windows \ SystemData \ S-1-5-18 \ ReadOnly ") HATA: Dosya adı, dizin adı veya birim etiketi sözdizimi hatalı. - bu bana bir özyineleme sorunu gibi görünüyor ve dosya yolu çok uzadığında durur.
Peter Hahndorf,

4

Peter H'ın cevabını kullandım ve çalıştığını doğruladım, ancak bunu birden çok sunucuda yapmam gerekti, bu yüzden kodunu yerel olarak veya başka bir makineden PS uzaktan kumandası yoluyla çalıştırılabilecek bir powershell betiğine değiştirdim. Bu .ps1 dosyası:

# 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

Evet bu bir tedavi çalışır. Powershell.exe ayrıcalıklarını yükseltmeyi unutmayın ("Yönetici Olarak Çalıştır")
Nexus

Çizgi: yankı y | cacls C: \ windows.old / T / G Herkes: F Olması gereken: echo y | cacls C: \ windows.old / T / G Herkes: F <kbd> y </kbd> ve <kbd> | </kbd>
user437960
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.