La salida unilog de Robocopy es un galimatías

10

Traté de obtener robocopy en Windows 7 para generar un registro Unicode, ya que tengo archivos con caracteres Unicode. El comando que usé:

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

Archivo de la copia funciona y la salida en pantalla es correcta, el archivo de registro en sí solo contiene galimatías. Esto es independientemente de si uso el símbolo del sistema o el Powershell.

¿Lo que da? ¿Estoy haciendo algo mal?

miro
fuente
Esta es también mi experiencia. ¿Encontraste una solución?
André Caron

Respuestas:

6

Error en XP27. Intenta bajar a XP26.

Parece ser un error en la XP27versión de RoboCopy (que viene con Windows 7).

En la versión XP26(que viene con Windows Vista) /UNILOGproduce un archivo de registro Unicode perfectamente legible para mí.

Si no tiene una copia de Vista, EasyRoboCopy también viene con la XP26versión. (En realidad, no he probado EasyRoboCopy en sí, solo lo extraje robocopy.exede su archivo de configuración usando WinRAR).

EMP
fuente
2

De un vistazo, diría que el archivo escrito por Robocopy mientras usa los interruptores /UNILOGy /TEEcontiene una marca de orden de byte little-endian UTF-16 seguida de un mecanografiado de terminal ISO-8859-1.

Para hacerlo legible, hice lo siguiente en 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

El archivo resultante coincide con lo que vi en el símbolo del sistema de Windows.

Lectura adicional: hombre dd, hombre iconv, hombrecol

ændrük
fuente
¿Alguna forma de hacer una conversión similar en Windows? He intentado esta conversión en tubería en PowerShell, pero sin éxito:([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 el
¡¡¡¡¡Esto funciona!!!!!
Corey
1

Mirando la salida del archivo (binario) en Win7, la opción / UNILOG es inútil. Escribe el BODE UNICODE estándar (FFFE), pero luego escribe todos los caracteres estrechos, EXCEPTO para la línea de opciones (por ejemplo, / BYTES / S / COPY: DATS ...), que es unicode real. Después de eso, se vuelve de nuevo a caracteres ANSI, y es no UTF-8, o bien; es decir, si tiene un nombre de archivo con un carácter ancho en la ruta, se convierte en un '?' personaje.

Aparentemente no hay interés en arreglarlo desde MSFT, ya que ha sido así por algún tiempo, y tengo todas las actualizaciones.

Keith
fuente
No existe la codificación "real unicode". ¿Quiso decir UTF-16 / UCS-2? Es un error de MS arrancar por nombrar este "unilog" en primer lugar ...
Nas Banov
1

Arreglé mis archivos de registro de Robocopy de formato Unicode ilegible en Windows (que fueron creados accidentalmente al agregar la salida normal de Robocopy a la salida Unicode de Out-File en PowerShell), de la siguiente manera:

En 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

¡El código anterior puede no funcionar para todos los tamaños de archivo!

(Crédito por el código: adapté el código de esta publicación de Ferdinand Prantl: Stackoverflow - Leer / analizar archivos binarios con PowerShell

Peter2050
fuente
Esto funciona si la salida no contiene caracteres Unicode; de lo contrario, esos caracteres se convierten a ASCII.
curropar
1

Use la página de códigos UTF-8, luego ejecute el convertidor de winword

Si los nombres de archivo o directorio contienen caracteres Unicode, antes de emitir el comando Robocopy con el /unilogparámetro, use el chcp 65001comando. (La página de códigos 65001 es UTF-8 .)

Una vez que tenga el registro Unicode destrozado, simplemente ábralo en MS Word como Unicode (UTF-8)y guárdelo:

Cuadro de diálogo de conversión de archivos de MS Word

Karan
fuente
0

En su caso, el comando en Powershell es algo así:

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

La solución alternativa es que use Out-File en lugar del parámetro incorporado / unilog. Obtendrá exactamente el mismo archivo de registro, pero ahora se escribirá correctamente en Unicode.

Vladimir
fuente
44
Claro que será unicode, pero no habrá caracteres unicode especiales. Es solo una salida ASCII traducida a unicode.
Davor Josipovic el