Hyper-V Server 2012 R2でwindows.oldを適切に削除する


22

Hyper-V Server 2012がインストールされているサーバーにHyper-V Server 2012 R2をWindows.oldインストールしました。これを行うと、標準フォルダーが作成されました。そのフォルダを安全に削除したいと思います。完全なGUIでこれを行う標準的な方法は、ディスククリーンアップを使用することですが、もちろん、Hyper-Vサーバーにはそのオプションがありません。

このシナリオでそのフォルダを削除する正式な方法はありますか?これがServer Coreである場合、デスクトップエクスペリエンスを含む完全なGUIをインストールできますが、フォルダーをきれいに削除するだけでは意味がありません。

ただ行うrmdir /sなどとは対照的に、質問する私の主な理由は、Windows.oldフォルダーに多くのジャンクションがあり、これを行うことの一部として本番OSコピーで何かを壊したくないことです。


cleanmgr.exeがコマンドラインで実行できることを読んでいます...これがサーバーコアまたは2012に適用されるかどうかわかりませんか?
ジョン

回答:


23

最初にcleanmgr.exe(ディスククリーンアップツール)をコピーして実行しようとしましたが、Core / Hyper-V Serverに存在しないDLLへの依存関係が多すぎます。

そこで、代わりにディレクトリを手動で削除しました。

最初に、すべてのジャンクションポイントとシンボリックリンクを削除しました。これを行うには、SysInternalsのjunction.exeを使用しました。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に戻り、アクセス許可をクリアし、すべてのファイルを削除する3つのコマンドを実行しました。

 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はなくなって、システムはすべての古いjunctionターゲットをそのままにして正常に実行されています。


junc.Txtの内容は何ですか?pastebinに投稿できますか?興味のあるものがリンクされていたら興味があります。
ロングネック

pastebin.com/pYBGR4apは junc.txtから、関連するすべての行を持っている
ピーター・ハーンドルフ

これはうまくいったようです、ありがとう!私は今もtakeown存在していることを知っています。
MikeBaz-MSFT

1
フォルダーを削除する前にジャンクションポイントを手動で削除する必要があるのはなぜですか?接合点はファイルシステムに保存されているので、フォルダーと一緒に確実に削除されます...?
アシュリー

3
@AshleySteel-ジャンクションを維持すると、takeownなどのコマンドが失敗するため。エラーは次のとおりです。情報:指定されたパスが見つかりません。( "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 \ Application Data \ Microsoft \ Windows \ SystemData \ S-1-5-18 \ ReadOnly ")エラー:ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません。-これは私には再帰問題のように見え、ファイルパスが長くなりすぎると停止します。
ピーターハーンドルフ

4

Peter Hの回答を使用して、それが機能することを確認しましたが、複数のサーバーでこれを行う必要があるため、彼のコードを、ローカルまたは別のマシンからのPSリモーティングを介して実行できるPowerShellスクリプトに変更しました。これは.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の特権を昇格することを忘れないでください(「管理者として実行」)
Nexus

行:echo y | cacls C:\ windows.old / T / G Everyone:F次のようにする必要があります:echo y | cacls C:\ windows.old / T / G Everyone:F <kbd> y </ kbd>と<kbd> | </ kbd>の間にスペースがない
-user437960
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.