Answers:
它似乎是XP27
RoboCopy版本(Windows 7附带)中的错误。
在版本XP26
(Windows Vista附带)中,/UNILOG
为我生成了完全可读的Unicode日志文件。
如果您没有Vista的副本,则EasyRoboCopy也会附带该XP26
版本。(我实际上并没有尝试过EasyRoboCopy本身,只是使用提取robocopy.exe
了它的安装文件WinRAR
。)
乍一看,我想说的是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命令提示符中看到的文件匹配。
([System.Text.Encoding]::Unicode).GetString([System.Text.Encoding]::Convert([System.Text.Encoding]::GetEncoding(28591), [System.Text.Encoding]::Unicode, ([System.Text.Encoding]::GetEncoding(28591)).GetBytes($_)))
查看Win7上的(二进制)文件输出,/ UNILOG选项无效。它写到标准的UNICODE BOM(FFFE),但随后进行到写入所有窄字符除非为options线(例如,/字节/ S / COPY:DATS ...),这是实际的unicode。之后,它将恢复为ANSI字符,也不是UTF-8。即,如果您的文件名在路径中带有宽字符,则将其转换为窄的“?” 字符。
从MSFT修复它显然没有兴趣,因为已经有一段时间了,而且我已经进行了所有更新。
我修复了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字符,则在发出带有/unilog
参数的Robocopy命令之前,请使用该chcp 65001
命令。(代码页65001为UTF-8。)
弄乱了Unicode日志后,只需在MS Word中将其打开Unicode (UTF-8)
并保存:
就您而言,Powershell中的命令如下所示:
robocopy C:\mysource D:\mydest /mir | Out-File backup.log
解决方法是使用Out-File而不是内置的/ unilog参数。您将获得完全相同的日志文件,但是现在它将以unicode正确编写。
chcp
在robocopy命令之前,使用正确的代码页运行命令。
对于UTF-8(不适用于robocopy和希伯来语,也许还不能使用其他语言):
chcp 65001 | Out-Null
对于希伯来语:
chcp 1255 | Out-Null
完整的代码页列表:https : //docs.microsoft.com/zh-cn/windows/desktop/intl/code-page-identifiers