2017-08-28 4 views
0

Je suis en train d'ajouter la chaîne « KB » dans un fichier après avoir écrit la sortie d'une commande de fenêtres:Ajouter au fichier dans Windows en utilisant >> montre des caractères étranges

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

mais dans le bloc-notes, je vois quelques-uns d'étranges personnages orientaux au lieu de KB

FreePhysicalMemory 
1441960    
䉋ഠ∊䉋•਍਍ 

-je voir le texte « FreePhysicalMemory 1.441.960 KB ». Si possible, je voudrais avoir KB après le numéro, pas sur une nouvelle ligne. Une fois cela fait, je vais utiliser le fichier avec un autre programme (InterSystems Caché) et le placer dans un autre fichier html, mais cela ne devrait pas avoir d'importance.

Répondre

2

wmic écrit la sortie sous la forme UTF-16LE (avec un BOM), lorsque vous y ajoutez des caractères ASCII tends to look Chinese.

Vous pouvez forcer cmd.exe écrire UTF-16 et avec le commutateur/U:

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

Pour l'écrire une seule ligne est beaucoup plus compliqué que cela devrait être.

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 

tuyauterie à more convertit à partir de UTF-16 et le second for loop removes empty lines.

+0

Vous n'avez pas besoin de rediriger vers more.com. La boucle 'for' de CMD exécute wmic.exe avec sa sortie stdout redirigée vers un canal. C'est tout ce dont vous avez besoin pour faire wmic.exe sortie texte encodé OEM. En général, faites attention à mojibake ici car CMD décode les lignes de sortie en utilisant la page de code de la console courante, et utilise sinon ANSI lorsqu'il est exécuté sans console (c'est-à-dire détaché). La console est par défaut OEM, mais elle a peut-être été modifiée via chcp.com. – eryksun

+0

La boucle 'for' fonctionne autour d'un bogue dans wmic.exe. Le descripteur de fichier d'E/S bas d'exécution C est ouvert en mode texte, ce qui traduit LF => CRLF. wmic.exe écrit des lignes qui se terminent déjà dans CRLF, de sorte que le runtime C finit par écrire des lignes qui se terminent par CRCRLF. La première boucle 'for' divise les lignes sur le CRLF final, mais laisse un CR final sur chaque ligne. – eryksun

+0

En général, si wmic.exe code sa sortie en tant que texte OEM, il risque de ne pas coder correctement les chaînes Unicode telles que les noms de fichiers, le texte de registre et les noms d'utilisateur. Il est préférable de l'écrire en UTF-16 dans un fichier si c'est potentiellement un problème. – eryksun