Wyjście robocopy unilog jest bełkotem

10

Próbowałem uzyskać robocopy w systemie Windows 7, aby wygenerować dziennik Unicode, ponieważ mam pliki ze znakami Unicode. Polecenie, którego użyłem:

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

Plik kopii działa, a wynik na ekranie jest poprawny, sam plik dziennika zawiera tylko bełkot. Jest to niezależne od tego, czy korzystam z wiersza polecenia, czy z programu Powershell.

Co daje? czy robię coś źle?

miro
źródło
To także moje doświadczenie. Znalazłeś rozwiązanie?
André Caron

Odpowiedzi:

6

Błąd w XP27. Spróbuj obniżyć do XP26.

Wygląda na to, że jest to błąd w XP27wersji RoboCopy (która jest dostarczana z Windows 7).

W wersji XP26(dostarczanej z Windows Vista) /UNILOGtworzy dla mnie doskonale czytelny plik dziennika Unicode.

Jeśli nie masz kopii Visty wokół EasyRoboCopy, dołączona jest również XP26wersja. (Właściwie nie próbowałem sam EasyRoboCopy, po prostu wyodrębniłem robocopy.exego z pliku instalacyjnego za pomocą WinRAR.)

EMP
źródło
2

Na pierwszy rzut oka powiedziałbym, że plik napisany przez Robocopy podczas używania przełączników /UNILOGi /TEEzawiera znak kolejności bajtów endianu UTF-16, po którym następuje terminal maszynowy ISO-8859-1.

Aby było czytelne, wykonałem następujące czynności w 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

Wynikowy plik jest zgodny z tym, co zobaczyłem w wierszu polecenia systemu Windows.

Dalsza lektura: mężczyzna dd, mężczyzna iconv, mężczyznacol

ændrük
źródło
W jakiś sposób zrobić podobną konwersję w systemie Windows? Próbowałem tej konwersji w potoku w PowerShell, ale bez powodzenia:([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
To działa!!!!!
Corey,
1

Patrząc na (binarne) wyjście pliku Win7, opcja / UNILOG jest bezużyteczna. Zapisuje standardowy UNICODE BOM (FFFE), ale następnie zapisuje wszystkie wąskie znaki Z WYJĄTKIEM linii opcji (np. / BYTES / S / COPY: DATS ...), która jest faktycznym unicode. Następnie wraca do znaków ANSI i nie jest też UTF-8; tzn. jeśli masz nazwę pliku z szerokim znakiem na ścieżce, jest ona konwertowana na wąskie „?” postać.

Najwyraźniej nie jest zainteresowany naprawieniem go z MSFT, ponieważ tak było od jakiegoś czasu i mam wszystkie aktualizacje.

Keith
źródło
Nie ma czegoś takiego jak kodowanie „rzeczywistego Unicode”. Miałeś na myśli UTF-16 / UCS-2? MS jest winny uruchomić się, nazywając to „unilog” w pierwszej kolejności ...
Nas Banov
1

Naprawiłem moje nieczytelne pliki dziennika Robocopy w formacie Unicode w systemie Windows (które zostały przypadkowo utworzone przez dołączenie normalnego wyjścia Robocopy do wyjścia Unicode z pliku wyjściowego w programie PowerShell) w następujący sposób:

W 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

Powyższy kod może nie działać dla wszystkich rozmiarów plików!

(Kredyt na kod: Dostosowałem kod z tego postu przez Ferdinanda Prantla: Stackoverflow - Odczytywanie / Parsowanie plików binarnych za pomocą programu PowerShell

Peter2050
źródło
Działa to, jeśli dane wyjściowe nie zawierają znaków Unicode; w przeciwnym razie znaki te są konwertowane na ASCII.
curropar
1

Użyj strony kodowej UTF-8, a następnie uruchom konwerter winword

Jeśli nazwy plików lub katalogów zawierają znaki Unicode, to przed wydaniem polecenia Robocopy z /unilogparametrem użyj chcp 65001polecenia. (Strona kodowa 65001 to UTF-8 .)

Po utworzeniu zniekształconego dziennika Unicode po prostu otwórz go w MS Word jako Unicode (UTF-8)i zapisz:

Okno dialogowe konwersji pliku MS Word

Karan
źródło
0

W twoim przypadku polecenie w programie Powershell wygląda mniej więcej tak:

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

Obejściem tego problemu jest użycie Out-File zamiast parametru wbudowanego / unilog. Otrzymasz dokładnie ten sam plik dziennika, ale teraz zostanie poprawnie zapisany w standardzie Unicode.

Vladimir
źródło
4
Na pewno będzie to Unicode, ale nie będzie specjalnych znaków Unicode. To tylko wyjście ASCII przetłumaczone na Unicode.
Davor Josipovic