2017-08-28 43 views
0

我想已經從Windows命令寫入的輸出後,追加字符串「KB」到一個文件:追加在Windows中使用文件>>顯示奇怪的字符

C:\Users\Administrator> wmic OS get FreePhysicalMemory > C:\temp\temp.txt 
C:\Users\Administrator> echo KB >> C:\temp\temp.txt 

,但在記事本中我看到一些奇怪的東方字符而不是KB

FreePhysicalMemory 
1441960    
䉋ഠ∊䉋•਍਍ 

我期望看到文字「FreePhysicalMemory 1441960 KB」。 如果可能,我希望在數字後有KB,而不是換行。 一旦我這樣做,我將與另一個程序(InterSystemsCaché)一起使用該文件,並將其放在另一個html文件中,但這應該不重要。

回答

2

wmic將輸出寫爲UTF-16LE(帶有BOM),當您將ASCII字符添加到它時tends to look Chinese

您可以強制CMD.EXE寫UTF-16以及與/ U開關:

wmic OS get FreePhysicalMemory > out.txt 
cmd /U /C echo kb ^>^> out.txt 

把它寫爲單行是一個複雜得多比它應該是。

FOR /F "delims=" %A IN ('wmic OS get FreePhysicalMemory /Format:list ^| more') do @FOR /F "tokens=1,* delims==" %B in ("%A") do @echo.%B %C KB > out.txt 

管道到從more UTF-16和second for loop removes empty lines轉換。

+0

您不需要連接到more.com。 CMD的for循環運行wmic.exe,其stdout被重定向到管道。這就是您需要製作wmic.exe輸出OEM編碼文本的全部內容。一般來說,請注意這裏的mojibake,因爲CMD使用當前的控制檯代碼頁解碼輸出行,否則在沒有控制檯(即分離)的情況下運行時使用ANSI。控制檯默認爲OEM,但它可能已通過chcp.com更改。 – eryksun

+0

for循環可以解決wmic.exe中的一個bug。 C運行時低I/O文件描述符在文本模式下打開,該模式翻譯LF => CRLF。 wmic.exe會寫入已經以CRLF結尾的行,因此C運行庫最終會寫入以CRCRLF結尾的行。第一個'for'循環在最後的CRLF上分割行,但在每行上留下尾隨的CR。 – eryksun

+0

通常wmic.exe將其輸出編碼爲OEM文本,可能會錯誤地編碼Unicode字符串,如文件名,註冊表文本和用戶名。如果這可能是一個問題,最好讓它將UTF-16寫入文件。 – eryksun