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.)

EMP
источник
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

ændrük
источник
Любой способ сделать подобное преобразование в 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

Peter2050
источник
Это работает, если вывод не содержит символов 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.
Давор Йосипович
0

Выполните chcpкоманду перед командой robocopy с правильной кодовой страницей.

для UTF-8 (не работает с robocopy и ивритом и, возможно, с другими языками):

chcp 65001 | Out-Null

для иврита:

chcp 1255 | Out-Null 

Полный список кодовых страниц: https://docs.microsoft.com/en-us/windows/desktop/intl/code-page-identifiers

mansh_av
источник