Robocopy unilog输出乱码


10

我尝试在Windows 7中获取robocopy以生成Unicode日志,因为我具有带Unicode字符的文件。我使用的命令:

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

文件复制正常且屏幕输出正确,日志文件本身仅包含乱码。不管我使用命令提示符还是Powershell。

是什么赋予了?难道我做错了什么?


这也是我的经验。您找到解决方案了吗?
安德烈·卡隆

Answers:


6

XP27中的错误。尝试降级为XP26。

它似乎是XP27RoboCopy版本(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($_)))
Davor Josipovic

这有效!!!!!
Corey

1

查看Win7上的(二进制)文件输出,/ UNILOG选项无效。它写到标准的UNICODE BOM(FFFE),但随后进行到写入所有窄字符除非为options线(例如,/字节/ S / COPY:DATS ...),这是实际的unicode。之后,它将恢复为ANSI字符,也不是UTF-8。即,如果您的文件名在路径中带有宽字符,则将其转换为窄的“?” 字符。

从MSFT修复它显然没有兴趣,因为已经有一段时间了,而且我已经进行了所有更新。


没有“实际unicode”编码之类的东西。您是说UTF-16 / UCS-2吗?首先为该“ unilog”命名会导致MS错误启动
Nas Banov

1

我修复了Windows中无法读取的Unicode格式的Robocopy日志文件(这些错误文件是通过将常规Robocopy输出附加到PowerShell中Out-File的Unicode输出中意外创建的),如下所示:

在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

上面的代码可能不适用于所有文件大小!

(代码来源:我改编自Ferdinand Prantl的这篇文章中的代码:Stackoverflow-使用PowerShell读取/解析二进制文件


如果输出不包含Unicode字符,则此方法有效。否则,这些字符将转换为ASCII。
curropar

1

使用UTF-8代码页,然后运行winword转换器

如果您的文件或目录名称包含Unicode字符,则在发出带有/unilog参数的Robocopy命令之前,请使用该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。
Davor Josipovic

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.