Robocopyのunilog出力が意味不明です


10

Unicode文字のファイルがあるため、Windows 7でrobocopyを使用してUnicodeログを生成しようとしました。私が使用したコマンド:

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

コピーが機能し、画面上の出力が正しいことをファイルします。ログファイル自体は意味不明なだけです。これは、コマンドプロンプトとPowershellのどちらを使用しているかには関係ありません。

何ができますか?私は何か間違ったことをしていますか?


これも私の経験です。解決策は見つかりましたか?
アンドレ・キャノン

回答:


6

XP27のバグ。XP26にダウングレードしてみてください。

XP27RoboCopy(Windows 7に付属)のバージョンのバグのようです。

バージョンXP26(Windows Vistaに付属)/UNILOGでは、完全に読み取り可能なUnicodeログファイルが生成されます。

Vistaのコピーがない場合は、EasyRoboCopyを配置するXP26バージョンも付属しています。(EasyRoboCopy自体を実際に試したわけではなく、robocopy.exeを使用してセットアップファイルから抽出しただけですWinRAR。)


2

一見する/UNILOGと、/TEEスイッチを使用してRobocopyによって書き込まれたファイルには、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


ウィンドウズで同様の変換を行う方法はありますか?私は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

これは動作します!!!!!
コーリー

1

Win7の(バイナリ)ファイル出力を見ると、/ UNILOGオプションは役に立ちません。これは、標準UNICODE BOM(FFFE)を書き込みますが、その後のすべての狭い文字を書き込むに進み、EXCEPTオプションライン(例えば、/バイト/ S / COPY:DATS ...)のため、実際のユニコードです。その後、ANSI文字に戻り、UTF-8でもありません。つまり、パスにワイド文字を含むファイル名がある場合、そのファイル名は狭い '?'に変換されます。キャラクター。

MSFTから修正することに関心がないようです。これはしばらくの間この方法で行われており、すべての更新を取得しているためです。


「実際のユニコード」エンコーディングなどはありません。UTF-16 / UCS-2ですか?そもそもこの「ユニログ」に名前を付けるために起動するのはMSの責任です...
Nas Banov

1

Windowsで読み取り不可能なUnicode形式のRobocopyログファイル(PowerShellのOut-FileからのUnicode出力に通常のRobocopy出力を誤って追加することによって作成された)を次のように修正しました。

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 2018年

1

UTF-8コードページを使用してから、Winword Converterを実行します

ファイル名またはディレクトリ名に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

回避策は、組み込みの/ unilogパラメータの代わりにOut-Fileを使用することです。まったく同じログファイルを取得しますが、Unicodeで適切に書き込まれます。


4
確かにそれはユニコードですが、特別なユニコード文字はありません。これは、ユニコードに変換されたASCII出力です。
Davor Josipovic 2013

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.