Robocopy Unilog выход является бессмысленным


10

Я попытался получить robocopy в Windows 7 для создания журнала Unicode, так как у меня есть файлы с символами Unicode. Команда, которую я использовал:

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

Файл копии работает, и вывод на экран правильный, сам файл журнала просто содержит бред. Это независимо от того, использую ли я командную строку или Powershell.

Что дает? Я делаю что-то неправильно?


Это тоже мой опыт. Вы нашли решение?
Андре Карон

Ответы:


6

Ошибка в XP27. Попробуйте понизиться до XP26.

Кажется, это ошибка в XP27версии RoboCopy (которая поставляется с Windows 7).

В версии XP26(которая поставляется с Windows Vista) /UNILOGпроизводит отлично читаемый файл журнала Unicode для меня.

Если у вас нет копии Vista, лежащая вокруг EasyRoboCopy, также поставляется с XP26версией. (Я на самом деле не пробовал EasyRoboCopy, просто извлек robocopy.exeего из установочного файла, используя WinRAR.)


2

На первый взгляд, я бы сказал , что файл написан Robocopy , а с помощью /UNILOGи /TEEпереключателей содержит мало-младшему метку порядка байтов UTF-16 , за которым следует терминала машинописи ISO-8859-1.

Чтобы сделать его читабельным, я сделал в 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

Полученный файл соответствует тому, что я видел в командной строке Windows.

Дальнейшее чтение: мужчина dd, мужчина iconv, мужчинаcol


Любой способ сделать подобное преобразование в Windows? Я пробовал это преобразование в трубе в PowerShell, но безуспешно:([System.Text.Encoding]::Unicode).GetString([System.Text.Encoding]::Convert([System.Text.Encoding]::GetEncoding(28591), [System.Text.Encoding]::Unicode, ([System.Text.Encoding]::GetEncoding(28591)).GetBytes($_)))
Давор Йосипович

Это работает!!!!!
Кори

1

Если посмотреть на вывод (двоичного) файла на Win7, опция / UNILOG бесполезна. Он записывает стандартную UNICODE BOM (FFFE), но затем переписывает все узкие символы, КРОМЕ для строки параметров (например, / BYTES / S / COPY: DATS ...), которая является фактическим Unicode. После этого, он возвращается к ANSI символов, и это не UTF-8, либо; то есть, если у вас есть имя файла с широким символом в пути, оно преобразуется в узкий '?' персонаж.

По-видимому, нет никакого интереса к исправлению этого из MSFT, так как это было в течение некоторого времени, и у меня есть все обновления.


Не существует такой вещи, как «фактическая кодировка Unicode». Вы имели в виду UTF-16 / UCS-2? Во-первых, виновата MS в том, что я назвал этот "unilog" ...
Nas Banov

1

Я исправил свои нечитаемые файлы журнала Robocopy в формате Unicode в Windows (которые были случайно созданы путем добавления нормального вывода Robocopy к выводу Unicode из Out-File в PowerShell) следующим образом:

В 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

Приведенный выше код может работать не для всех размеров файлов!

(Кредит за код: я адаптировал код из этого поста от Фердинанда Прантля: Stackoverflow - чтение / анализ двоичных файлов с помощью PowerShell


Это работает, если вывод не содержит символов Unicode; в противном случае эти символы преобразуются в ASCII.
Курропар

1

Используйте кодовую страницу UTF-8, затем запустите конвертер winword

Если ваши имена файлов или каталогов содержат символы Unicode, то перед выполнением команды Robocopy с /unilogпараметром используйте chcp 65001команду. (Кодовая страница 65001 - UTF-8 .)

Как только вы получите искаженный журнал Unicode, просто откройте его в MS Word Unicode (UTF-8)и сохраните:

Диалог преобразования файлов MS Word


0

В вашем случае команда в Powershell выглядит примерно так:

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

Обходной путь заключается в том, что вы используете Out-File вместо встроенного параметра / unilog. Вы получите точно такой же файл журнала, но теперь он будет правильно записан в юникоде.


4
Конечно, это будет Unicode, но не будет специальных символов Unicode. Это просто вывод ASCII, переведенный в Unicode.
Давор Йосипович

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.