Keluaran Robocopy unilog adalah omong kosong

9

Saya mencoba mendapatkan robocopy di Windows 7 untuk menghasilkan log Unicode, karena saya memiliki file dengan karakter Unicode. Perintah yang saya gunakan:

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

File copy berfungsi dan output pada layar sudah benar, file log itu sendiri hanya berisi omong kosong. Ini terlepas dari apakah saya menggunakan Command Prompt atau Powershell.

Apa yang menyebabkannya? Apakah saya melakukan sesuatu yang salah?

miro
sumber
Ini juga pengalaman saya. Apakah Anda menemukan solusinya?
André Caron

Jawaban:

5

Bug di XP27. Coba turunkan ke XP26.

Tampaknya ada bug di XP27 versi RoboCopy (yang dilengkapi dengan Windows 7).

Dalam versi XP26 (yang dilengkapi dengan Windows Vista) /UNILOG menghasilkan file log Unicode yang mudah dibaca bagi saya.

Jika Anda tidak memiliki salinan Vista EasyRoboCopy juga dilengkapi dengan XP26 versi. (Saya belum benar-benar mencoba EasyRoboCopy sendiri, baru saja diekstrak robocopy.exe keluar dari file pengaturannya menggunakan WinRAR.)

EMP
sumber
2

Sekilas, saya akan mengatakan file yang ditulis oleh Robocopy saat menggunakan /UNILOG dan /TEE switch berisi tanda pesanan byte sedikit-endian UTF-16 diikuti oleh naskah naskah terminal ISO-8859-1.

Agar mudah dibaca, saya melakukan hal berikut di 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

File yang dihasilkan cocok dengan apa yang saya lihat di command prompt Windows.

Bacaan lebih lanjut: pria dd, pria iconv, pria col

ændrük
sumber
Adakah cara untuk melakukan konversi serupa di windows? Saya telah mencoba konversi ini dalam pipa di PowerShell, tetapi tidak berhasil: ([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
Ini bekerja!!!!!
Corey
1

Melihat output file (biner) pada Win7, opsi / UNILOG tidak berguna. Itu menulis standar UNICODE BOM (FFFE), tetapi kemudian mulai menulis semua karakter sempit KECUALI untuk baris opsi (mis., / BYTES / S / COPY: DATS ...), yang merupakan unicode aktual. Setelah itu, ia kembali ke karakter ANSI tidak UTF-8, baik; yaitu, jika Anda memiliki nama file dengan karakter lebar di jalur, itu dikonversi menjadi '?' karakter.

Tampaknya tidak tertarik untuk memperbaikinya dari MSFT, karena sudah seperti ini selama beberapa waktu, dan saya memiliki semua pembaruan.

Keith
sumber
Tidak ada yang disebut encoding "unicode aktual". Apakah maksud Anda UTF-16 / UCS-2? Ini kesalahan MS untuk boot karena penamaan ini "unilog" di tempat pertama ...
Nas Banov
1

Saya memperbaiki file log Robocopy Unicode-format yang tidak dapat dibaca di Windows (yang secara tidak sengaja dibuat dengan menambahkan output Robocopy normal ke output Unicode dari Out-File di PowerShell), sebagai berikut:

Di 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

Kode di atas mungkin tidak berfungsi untuk semua ukuran file!

(Kredit untuk kode: Saya mengadaptasi kode dari pos ini oleh Ferdinand Prantl: Stackoverflow - Baca / Parse file Biner dengan PowerShell

Peter2050
sumber
Ini berfungsi jika output tidak mengandung karakter Unicode; jika tidak, karakter tersebut akan dikonversi ke ASCII.
curropar
1

Gunakan halaman kode UTF-8, kemudian jalankan winword converter

Jika nama file atau direktori Anda mengandung karakter Unicode maka sebelum mengeluarkan perintah Robocopy dengan /unilog parameter menggunakan chcp 65001 perintah. (Halaman kode 65001 adalah UTF-8 .)

Setelah Anda memiliki log Unicode yang hancur, buka saja di MS Word as Unicode (UTF-8) dan simpan:

MS Word File Conversion Dialog

Karan
sumber
0

Dalam kasus Anda, perintah di Powershell berbunyi seperti ini:

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

Solusinya adalah Anda menggunakan Out-File alih-alih parameter bawaan / unilog. Anda akan mendapatkan file log yang persis sama, tetapi sekarang akan ditulis dengan benar dalam unicode.

Vladimir
sumber
3
Tentu itu akan unicode, tetapi tidak akan ada karakter unicode khusus. Hanya saja keluaran ASCII diterjemahkan ke unicode.
Davor Josipovic