Combine Batch/WMIC + ANSI/UNICODE Output formatting
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Ominous Technology Looping
--
Chapters
00:00 Combine Batch/Wmic + Ansi/Unicode Output Formatting
01:07 Accepted Answer Score 11
03:27 Answer 2 Score 3
03:55 Answer 3 Score 0
04:33 Answer 4 Score 0
05:09 Thank you
--
Full question
https://superuser.com/questions/812438/c...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#windows #batch #wmic
#avk47
ACCEPTED ANSWER
Score 11
Pipe the output from Wmic
through more
:
wmic CPU Get AddressWidth |more >> "C:\test.txt"
Edit for some more background: the issue you see is due to wmic
output being unicode utf-16. This means that each character (or more correctly, most of them) is encoded in two bytes. wmic
also puts a so called BOM (byte order mark) at the beginning of the output. See byte content below:
FF FE 44 00 65 00 73 00-63 00 72 00 69 00 70 00 ..D.e.s.c.r.i.p.
Those first two bytes (FF FE) specify endianness for UTF-16 and allow data processing tools to recognize the encoding [being UTF-16 little endian].
Obviously type
does this check and if it finds the BOM then properly recognizes the encoding.
On the other hand, if you first echo text
and then append Wmic
output - there is no BOM at the beginning and you can see inconsistent encoding:
74 65 78 74 20 0D 0A 44-00 65 00 73 00 63 00 72 text ..D.e.s.c.r
If you put it through type
it cannot infer how to interpret, /most likely/ assumes single byte ('ANSI') and this results in spaces produced for non printable characters (zeros, being in fact high order bytes of two byte character encoding).
more
handles more (pun intended) cases and produces correct output for basic ASCII chars that's why it's commonly used as a hack for this purpose.
One additional note: some editors (notepad being simplest example) will properly display utf-16 encoded file if it is consistent - even without BOM. There is a way to force echo
to produce unicode output (but beware it does not produce BOM) - using cmd /u
causes output for internal commands to be unicode.
I can't really say why cmd unicode support is so limited (or as most would say - broken...) - probably historical/compatibility issues.
Last thing - if you need better unicode support (among many other benefits) I would recommend migrating to powershell
ANSWER 2
Score 3
The more
command does not seem to do the conversion well. Note the double CR (\r) in the x2.txt output file.
C:>wmic diskdrive where "model = 'HGST HTS725050A7E630 ATA Device'" get index >x1.txt
C:>wmic diskdrive where "model = 'HGST HTS725050A7E630 ATA Device'" get index | more >x2.txt
C:>odd x1.txt
000000 ff fe 49 00 6e 00 64 00 65 00 78 00 20 00 20 00
377 376 I \0 n \0 d \0 e \0 x \0 \0 \0
000010 0d 00 0a 00 30 00 20 00 20 00 20 00 20 00 20 00
\r \0 \n \0 0 \0 \0 \0 \0 \0 \0
000020 20 00 0d 00 0a 00
\0 \r \0 \n \0
000026
C:>odd x2.txt
000000 49 6e 64 65 78 20 20 0d 0d 0a 30 20 20 20 20 20
I n d e x \r \r \n 0
000010 20 0d 0d 0a 0d 0d 0a 0d 0a
\r \r \n \r \r \n \r \n
Update It appears that PowerShell may handle this better.
Get-WmiObject Win32_diskdrive |
Where-Object { $_.Model -like '*WD*' } |
Select-Object -Property Model |
Out-File -PSPath t1.txt
Get-WmiObject Win32_diskdrive |
Where-Object { $_.Model -like '*WD*' } |
Select-Object -Property Model |
Out-File -PSPath t2.txt -Encoding default
It is clear that CIM is the direction PowerShell is going in the future. Better to start using it now.
Get-CimInstance CIM_DiskDrive |
Where-Object { $_.Model -like '*WD*' } |
Select-Object -Property Model |
Out-File -PSPath t1.txt
Get-CimInstance CIM_DiskDrive |
Where-Object { $_.Model -like '*WD*' } |
Select-Object -Property Model |
Out-File -PSPath t2.txt -Encoding default
ANSWER 3
Score 0
If we need only to get WMIC to add its data to a log file please try the below:
Test.bat
set Log=%~dpn0.log&::
set L=^>^>"%Log%" 2^>^&1 echo&::
%L% ^
wmic /APPEND:"%Log%" /locale:ms_409 service get name,startname,state,status&::
wmic /APPEND:"%Log%" /locale:ms_409 service get name,startname,state,status&::
notepad "%Log%"
exit
The resulting Test.log file will look like:
wmic /APPEND:"D:\Test\T.log" /locale:ms_409 service get name,startname,state,status
Name StartName State Status
AdobeARMservice LocalSystem Running OK
AJRouter NT AUTHORITY\LocalService Stopped OK
ALG NT AUTHORITY\LocalService Stopped OK
AppHostSvc LocalSystem Running OK
AppIDSvc NT Authority\LocalService Stopped OK
ANSWER 4
Score 0
Refer to this answer :WMIC.bat file will not export/output properly
This Batch file show you the difference of using with and without More
command the behivor of exporting results in a text file.
@echo off
REM https://stackoverflow.com/questions/34075745/wmic-bat-file-will-not-export-output-properly?answertab=active#tab-top
Title WMIC file will not export/output properly
set "WithoutMore=%~dp0WithoutMore.txt"
set "WithMore=%~dp0WithMore.txt"
(
wmic csproduct
wmic cpu get name,AddressWidth,Description
wmic diskdrive get model,size
WMIC PATH Win32_Battery Get EstimatedChargeRemaining
ipconfig /all
)>"%WithoutMore%"
Start "" "%WithoutMore%"
(
wmic csproduct
wmic cpu get name,AddressWidth,Description
wmic diskdrive get model,size
WMIC PATH Win32_Battery Get EstimatedChargeRemaining
ipconfig /all
) | more >"%WithMore%"
Start "" "%WithMore%"