A saída unilog da robocopy é sem sentido

10

Tentei obter robocopy no Windows 7 para gerar um log Unicode, pois tenho arquivos com caracteres Unicode. O comando que eu usei:

robocopy C:\mysource D:\mydest /mir /unilog:backup.log /tee

O arquivo em que a cópia funciona e a saída na tela está correta, o próprio arquivo de log contém apenas sem sentido. Independentemente de eu usar o prompt de comando ou o Powershell.

O que da? Estou fazendo algo errado?

miró
fonte
Essa também é a minha experiência. Você encontrou uma solução?
André Caron

Respostas:

6

Bug no XP27. Tente fazer o downgrade para o XP26.

Parece ser um bug na XP27versão do RoboCopy (que acompanha o Windows 7).

Na versão XP26(que acompanha o Windows Vista) /UNILOGproduz um arquivo de log Unicode perfeitamente legível para mim.

Se você não possui uma cópia do Vista, o EasyRoboCopy também vem com a XP26versão. (Na verdade, eu não tentei o EasyRoboCopy, apenas extraí robocopy.exeo arquivo de instalação usando WinRAR.)

EMP
fonte
2

À primeira vista, eu diria que o arquivo escrito por Robocopy ao usar as opções /UNILOGe /TEEcontém uma marca de pedido de bytes UTF-16 little-endian seguida por um terminal ISO-8859-1.

Para torná-lo legível, fiz o seguinte no Ubuntu:

dd if=robocopy.log ibs=1 skip=2 obs=512        | # Strip the byte order mark
  iconv --from-code ISO-8859-1 --to-code UTF-8 | # Convert to UTF-8
  col -b > robocopy_utf-8.log                    # Interpret control characters

O arquivo resultante corresponde ao que vi no prompt de comando do Windows.

Leitura adicional: man dd, man iconv, mancol

ændrük
fonte
Alguma maneira de fazer uma conversão semelhante no Windows? Eu tentei essa conversão em pipe no PowerShell, mas sem sucesso:([System.Text.Encoding]::Unicode).GetString([System.Text.Encoding]::Convert([System.Text.Encoding]::GetEncoding(28591), [System.Text.Encoding]::Unicode, ([System.Text.Encoding]::GetEncoding(28591)).GetBytes($_)))
Davor Josipovic 28/13
Isso funciona!!!!!
Corey
1

Observando a saída do arquivo (binário) no Win7, a opção / UNILOG é inútil. Ele grava a BOM UNICODE padrão (FFFE), mas depois escreve todos os caracteres restritos, EXCETO para a linha de opções (por exemplo, / BYTES / S / COPY: DATS ...), que é unicode real. Depois disso, ele retorna aos caracteres ANSI e também não é UTF-8; ou seja, se você tiver um nome de arquivo com um caractere amplo no caminho, ele será convertido em um estreito '?' personagem.

Aparentemente, não há interesse em corrigi-lo do MSFT, já que tem sido assim há algum tempo, e eu tenho todas as atualizações.

Keith
fonte
Não existe codificação "unicode real". Você quis dizer UTF-16 / UCS-2? É falha do MS inicializar por nomear esse "unilog" em primeiro lugar ...
Nas Banov 19/10/16
1

Corrigi meus arquivos de log Robocopy ilegíveis no formato Unicode no Windows (que foram criados acidentalmente anexando a saída normal do Robocopy à saída Unicode de saída de arquivo externo no PowerShell), da seguinte maneira:

No PowerShell:

$bytes = [System.IO.File]::ReadAllBytes('C:\Temp\RoboCopyLog.txt')
$len = $bytes.Length
#Remove the Unicode BOM, and convert to ASCII
$text = [System.Text.Encoding]::ASCII.GetString($bytes,2,$len -2)
$text

O código acima pode não funcionar para todos os tamanhos de arquivo!

(Crédito pelo código: adaptei o código desta postagem por Ferdinand Prantl: Stackoverflow - Ler / analisar arquivos binários com o PowerShell

Peter2050
fonte
Isso funciona se a saída não contiver caracteres Unicode; caso contrário, esses caracteres serão convertidos em ASCII.
Curropar 5/11
1

Use a página de código UTF-8 e execute o conversor do winword

Se os nomes de arquivos ou diretórios contiverem caracteres Unicode, antes de emitir o comando Robocopy com o /unilogparâmetro, use o chcp 65001comando (A página de códigos 65001 é UTF-8 .)

Depois de ter o log Unicode desconfigurado, basta abri-lo no MS Word como Unicode (UTF-8)e salve-o:

Diálogo de Conversão de Arquivos do MS Word

Karan
fonte
0

No seu caso, o comando no Powershell é mais ou menos assim:

robocopy C:\mysource D:\mydest /mir | Out-File backup.log

A solução alternativa é usar o arquivo externo em vez do parâmetro interno / unilog. Você obterá exatamente o mesmo arquivo de log, mas agora ele será gravado corretamente em unicode.

Vladimir
fonte
4
Claro que será unicode, mas não haverá caracteres unicode especiais. É apenas uma saída ASCII traduzida para unicode.
Davor Josipovic