Унілогічний вихід роботокопії - гнучко


10

Я намагався отримати робокопію в 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" ...
Нас Банов

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

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 параметра. Ви отримаєте абсолютно той самий файл журналу, але тепер він буде належним чином записаний в unicode.


4
Звичайно, це буде unicode, але спеціальних символів unicode не буде. Це просто ASCII вихід, переведений на unicode.
Давор Йосипович

0

Виконайте chcpкоманду перед командою роботокопіювання з правою сторінкою коду.

для UTF-8 (не працює з роботокопією та івритом та, можливо, іншими мовами):

chcp 65001 | Out-Null

для івриту:

chcp 1255 | Out-Null 

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.