L'output di unilog di Robocopy è incomprensibile


10

Ho cercato di ottenere robocopy in Windows 7 per generare un registro Unicode, dal momento che ho file con caratteri Unicode. Il comando che ho usato:

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

File la copia funziona e l'output su schermo è corretto, il file di registro stesso contiene solo incomprensibili. Questo indipendentemente dal fatto che io usi il Prompt dei comandi o Powershell.

Cosa dà? Sto facendo qualcosa di sbagliato?


Questa è anche la mia esperienza. Hai trovato una soluzione?
André Caron,

Risposte:


6

Bug in XP27. Prova il downgrade a XP26.

Sembra essere un bug nella XP27versione di RoboCopy (fornita con Windows 7).

Nella versione XP26(fornita con Windows Vista) /UNILOGproduce per me un file di registro Unicode perfettamente leggibile.

Se non si dispone di una copia di Vista che gira intorno a EasyRoboCopy viene fornito anche con la XP26versione. (In realtà non ho provato EasyRoboCopy stesso, ma ho estratto robocopy.exeil suo file di installazione utilizzando WinRAR.)


2

A prima vista, direi che il file scritto da Robocopy mentre si utilizza l'opzione /UNILOGe /TEEcontiene un contrassegno di ordine dei byte little-endian UTF-16 seguito da un dattiloscritto terminale ISO-8859-1.

Per renderlo leggibile, ho fatto quanto segue in 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

Il file risultante corrisponde a quello che ho visto nel prompt dei comandi di Windows.

Ulteriori letture: uomo dd, uomo iconv, uomocol


Qualche modo per fare una conversione simile in Windows? Ho provato questa conversione in pipe in PowerShell, ma senza successo:([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,

Questo funziona !!!!!
Corey,

1

Osservando l'output del file (binario) su Win7, l'opzione / UNILOG è inutile. Scrive lo standard UNICODE BOM (FFFE), ma poi procede alla scrittura di tutti i caratteri stretti TRANNE la riga delle opzioni (ad es., / BYTES / S / COPY: DATS ...), che è l'attuale unicode. Dopodiché, ritorna ai caratteri ANSI e non è neanche UTF-8; vale a dire, se hai un nome file con un carattere largo nel percorso, viene convertito in uno stretto "?" carattere.

Apparentemente nessun interesse a risolverlo da MSFT, dal momento che è stato così per un po 'di tempo, e ho tutti gli aggiornamenti.


Non esiste una codifica "unicode reale". Intendevi UTF-16 / UCS-2? È colpa di MS eseguire l'avvio per la denominazione di questo "unilog" in primo luogo ...
Nas Banov

1

Ho risolto i miei file di log Robocopy in formato Unicode illeggibili in Windows (che sono stati creati accidentalmente aggiungendo l'output Robocopy normale all'output Unicode da Out-File in PowerShell), come segue:

In 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

Il codice sopra potrebbe non funzionare per tutte le dimensioni di file!

(Credito per il codice: ho adattato il codice da questo post di Ferdinand Prantl: Stackoverflow - Leggi / Analizza i file binari con PowerShell


Funziona se l'output non contiene caratteri Unicode; in caso contrario, questi caratteri vengono convertiti in ASCII.
Curropar,

1

Usa la tabella codici UTF-8, quindi esegui winword converter

Se i nomi dei file o delle directory contengono caratteri Unicode, prima di eseguire il comando Robocopy con il /unilogparametro utilizzare il chcp 65001comando (La tabella codici 65001 è UTF-8 .)

Una volta che hai il registro Unicode alterato, basta aprirlo in MS Word come Unicode (UTF-8)e salvarlo:

Finestra di dialogo Conversione file MS Word


0

Nel tuo caso, il comando in Powershell è simile al seguente:

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

La soluzione alternativa è utilizzare Out-File invece del parametro incorporato / unilog. Otterrai esattamente lo stesso file di registro, ma ora verrà scritto correttamente in Unicode.


4
Sicuramente sarà unicode, ma non ci saranno caratteri unicode speciali. È solo l'output ASCII tradotto in Unicode.
Assapora Josipovic il

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.