ลบ windows.old อย่างถูกต้องบน Hyper-V Server 2012 R2


22

ฉันติดตั้ง Hyper-V Server 2012 R2 บนเซิร์ฟเวอร์ที่มีเซิร์ฟเวอร์ Hyper-V 2012 เมื่อฉันทำสิ่งนี้Windows.oldโฟลเดอร์มาตรฐานจะถูกสร้างขึ้น ตอนนี้ฉันต้องการลบโฟลเดอร์นั้นอย่างปลอดภัย วิธีมาตรฐานในการใช้ GUI แบบเต็มรูปแบบคือการใช้ Disk Cleanup แต่แน่นอนว่าฉันไม่มีตัวเลือกนั้นใน Hyper-V Server

มีวิธีที่เป็นทางการในการลบโฟลเดอร์นั้นในสถานการณ์นี้หรือไม่ ฉันรู้ว่านี่เป็น Server Core ฉันสามารถติดตั้ง GUI เต็มรูปแบบรวมถึงประสบการณ์บนเดสก์ท็อปได้ แต่นั่นเป็นเรื่องไร้สาระที่จะลบโฟลเดอร์ออกหมดจด

เหตุผลหลักของฉันในการถามแทนที่จะทำrmdir /sหรืออะไรบางอย่างก็คือWindows.oldโฟลเดอร์มีจุดเชื่อมต่อมากมายและฉันไม่ต้องการทำลายสิ่งใดในสำเนา OS ที่ใช้งานจริงซึ่งเป็นส่วนหนึ่งของการทำเช่นนี้


ฉันอ่าน cleanmgr.exe สามารถเรียกใช้ในบรรทัดคำสั่ง ... ไม่แน่ใจว่าสิ่งนี้นำไปใช้กับเซิร์ฟเวอร์หลักหรือ 2012 ???
john

คำตอบ:


23

ก่อนอื่นฉันพยายามคัดลอกและเรียกใช้ cleanmgr.exe (เครื่องมือล้างข้อมูลบนดิสก์) แต่มีการอ้างอิงมากเกินไปใน DLLs ซึ่งไม่มีอยู่ใน 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 หายไปแล้วและระบบทำงานได้ดีโดยมีจุดเชื่อมต่อเป้าหมายเก่าทั้งหมดไม่เสียหาย


เนื้อหาของ junc.Txt คืออะไร? คุณสามารถโพสต์ไว้ที่ pastebin ได้หรือไม่ ฉันสงสัยว่ามีสิ่งใดที่น่าสนใจเชื่อมโยงอยู่
longneck

pastebin.com/pYBGR4apมีบรรทัดที่เกี่ยวข้องทั้งหมดจาก junc.txt
Peter Hahndorf

ดูเหมือนว่าจะทำงานได้ดีขอบคุณ! ตอนนี้ฉันก็รู้takeownแล้วว่ามีอยู่ซึ่งฉันอายเล็กน้อยที่จะยอมรับว่าฉันไม่รู้
MikeBaz - MSFT

1
ทำไมหนึ่งจะต้องลบจุดเชื่อมต่อด้วยตนเองก่อนที่จะลบโฟลเดอร์? จุดเชื่อมต่อจะถูกเก็บไว้ในระบบแฟ้มดังนั้นจะถูกลบพร้อมกับโฟลเดอร์ ... ?
แอชลีย์

3
@AshleySteel - เพราะเมื่อรักษาการแยกคำสั่งเช่น takeown ล้มเหลว นี่คือข้อผิดพลาด: ข้อมูล: ระบบไม่สามารถค้นหาเส้นทางที่ระบุได้ ("C: \ windows.old \ Documents และ Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Application Data \ Microsoft \ Windows \ Windows SystemData \ S-1-5-18 \ ReadOnly ") ข้อผิดพลาด: ชื่อไฟล์ชื่อไดเรกทอรีหรือไวยากรณ์ของไดรฟ์ข้อมูลไม่ถูกต้อง - นี่เป็นปัญหาซ้ำซากสำหรับฉันและจะหยุดลงเมื่อเส้นทางของไฟล์ยาวเกินไป
ปีเตอร์ Hahndorf

4

ฉันใช้คำตอบของ Peter H และยืนยันว่ามันใช้งานได้ แต่ฉันจำเป็นต้องทำสิ่งนี้กับเซิร์ฟเวอร์หลายเครื่องดังนั้นฉันจึงแก้ไขโค้ดของเขาให้เป็นสคริปต์ PowerShell ที่สามารถเรียกใช้งานได้ทั้งในประเทศหรือผ่านทาง PS remoting จากเครื่องอื่น นี่คือไฟล์. 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

ใช่อันนี้ทำงานรักษา อย่าลืมที่จะยกระดับสิทธิ์ powershell.exe ("Run As Administrator")
Nexus

บรรทัด: echo y | cacls C: \ windows.old / T / G ทุกคน: F ควรเป็น: echo y | cacls C: \ windows.old / T / G ทุกคน: F ไม่มีช่องว่างระหว่าง <kbd> y </kbd> และ <kbd> | </kbd>
437960
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.