Remova corretamente o windows.old no Hyper-V Server 2012 R2


22

Instalei o Hyper-V Server 2012 R2 em um servidor com o Hyper-V Server 2012. Quando fiz isso, a Windows.oldpasta padrão foi criada. Agora eu gostaria de remover essa pasta com segurança. A maneira padrão de fazer isso com uma GUI completa seria usar a Limpeza de disco, mas é claro que não tenho essa opção no Hyper-V Server.

Existe uma maneira formal de remover essa pasta nesse cenário? Sei que esse era o Server Core, eu poderia instalar a GUI completa, incluindo o Desktop Experience, mas isso seria muita bobagem apenas para remover uma pasta de forma limpa.

Meu principal motivo para perguntar, em vez de fazer rmdir /sou algo parecido, é que a Windows.oldpasta possui muitas junções e não quero interromper nada na cópia do SO de produção como parte disso.


Eu li cleanmgr.exe pode ser executado na linha de comando ... Não tenho certeza se isso se aplica ao núcleo do servidor ou 2012 ???
john

Respostas:


23

Tentei primeiro copiar e executar o cleanmgr.exe (ferramenta de limpeza de disco), mas ele tem muitas dependências de DLLs que não estão presentes no Core / Hyper-V Server.

Então, em vez disso, excluí o diretório manualmente.

Primeiro, removi todos os pontos de junção e links simbólicos. Para fazer isso, usei o junction.exe do SysInternals. Copie o exe para um diretório em seu caminho. Eu o executei para obter uma lista de todas as junções:

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

Abri um PowerShell:

start powershell.exe

e executou o seguinte script para encontrar as linhas relevantes e executar o junction.exe novamente:

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

Isso removeu todos os pontos de junção e o único link simbólico no meu sistema.

de volta ao cmd.exe Agora executei três comandos para limpar permissões e excluir todos os arquivos:

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

No meu teste, instalei um novo servidor Hyper-V 2012 e, em seguida, atualizei para o 2012 R2, o Windows.old se foi e o sistema está funcionando bem com todos os destinos de junção antigos intactos.


Qual era o conteúdo do junc.Txt? Você pode publicá-lo em pastebin? Estou curioso para saber se algo de interesse está relacionado.
longneck

pastebin.com/pYBGR4ap tem todas as linhas relevantes de junc.txt
Peter Hahndorf

Parece ter funcionado bem, obrigado! Agora também sei que takeownexiste, o que me deixa um pouco envergonhado de admitir que não sabia.
MikeBaz - MSFT

1
Por que seria necessário remover manualmente os pontos de junção antes de excluir a pasta? Os pontos de junção são armazenados no sistema de arquivos, então com certeza seriam excluídos junto com a pasta ...?
Ashley

3
@AshleySteel - Porque, ao manter as junções, comandos como takeown falham. Aqui está o erro: INFO: O sistema não consegue encontrar o caminho especificado. ("C: \ windows.old \ Documentos e configurações \ Todos os usuários \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Dados de aplicativos \ Microsoft \ Windows \ SystemData \ S-1-5-18 \ ReadOnly ") ERRO: O nome do arquivo, o nome do diretório ou a sintaxe do rótulo do volume está incorreta. - isso parece um problema de recursão para mim e para quando o caminho do arquivo fica muito longo.
Peter Hahndorf

4

Eu usei a resposta de Peter H e confirmei que funciona, no entanto, precisava fazer isso em vários servidores, então modifiquei o código dele em um script do PowerShell que pode ser executado localmente ou via PS remoting de outra máquina. Este é o arquivo .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

Sim, este funciona um prazer. Não se esqueça de elevar privilégios Powershell.exe ( "Executar como administrador")
Nexus

Linha: eco y | cacls C: \ windows.old / T / G Todos: F Deve ser: eco y | cacls C: \ windows.old / T / G Todos: F Sem espaço entre <kbd> y </ kbd> e <kbd> | </ kbd>
user437960
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.