Search code examples
windowsbatch-filewmic

Text garble in batch script for wmic command


I'm trying to run the batch script to acquired the basic computer information like CPU,RAM and active Network card.Here is my code

@Echo OFF

set newline=^& echo.

echo Manufacturer Information> test1.txt

systeminfo|findstr /c:"Host Name" /c:"OS Name" /c:"System Model:" /c:"System Type:" /c:"Total Physical Memory:" >>test1.txt

echo CPU Information:>> test1.txt

wmic cpu get Name /Format:list >> test1.txt

echo %newline%Process Information:>> test1.txt

wmic computersystem get NumberofProcessors /Format:list >> test1.txt

echo %newline%NIC Information:>> test1.txt

wmic nicconfig where "IPEnabled=TRUE" get ipaddress, macaddress,defaultipgateway /format:list >>test1.txt

Output looks:

Manufacturer Information Host Name: DK-IT OS Name:
Microsoft Windows 8.1 Single Language System Model:
Inspiron 7537 System Type: x64-based PC Total Physical Memory: 6,043 MB CPU Information:

 N a m e = I n t e l ( R )   C o r e ( T M )   i 5 - 4 2 0 0 U   C P U   @   1 . 6 0 G H z 



Process Information:


 N u m b e r O f P r o c e s s o r s = 1 



NIC Information:


 D e f a u l t I P G a t e w a y = { " 1 0 . 5 . 1 . 1 " }     I P A d d r e s s = { " 1 0 . 5 . 4 . 5 4 " , " f e 8 0 : : 1 0 e b : 1 d

2 d : 2 0 8 8 : 8 b a 1 " } M A C A d d r e s s = 0 C : 8 B : F D : 9 C : 8 0 : 4 7

 D e f a u l t I P G a t e w a y =     I P A d d r e s s = { " 1 9 2 . 1 6 8 . 1 9 9 . 1 " }     M A C A d d r e s s = 0 0 : 5 0 : 5 6 :

C 0 : 0 0 : 0 1

D e f a u l t I P G a t e w a y = I P A d d r e s s = { " 1 9 2 . 1 6 8 . 1 9 0 . 1 " , " f e 8 0 : : 6 4 b 2 : 2 a a a : e f 6 4 : f a 9 a " } M A C A d d r e s s = 0 0 : 5 0 : 5 6 : C 0 : 0 0 : 0 8

Can someone help to modify the view of batch file output?


Solution

  • Your problem is SYSTEMINFO produces ANSII output (as do most commands), but WMIC produces Unicode output. The two do not mix well.

    Below are three solutions that all produce ANSII output.

    1) Pipe the WMIC output to MORE

    MORE converts Unicode to ANSII. I also pipe that result to FINDSTR to eliminate blank lines. The only problem with this solution is that a quirk with the conversions causes the WMIC output to have an extra carriage return at the end of each line (<CR><CR><LF> instead of <CR><LF>)

    @echo OFF
    >test1.txt (
      echo Manufacturer Information:
      systeminfo|findstr /c:"Host Name" /c:"OS Name" /c:"System Model:" /c:"System Type:" /c:"Total Physical Memory:"
    
      echo(
      echo CPU Information:
      wmic cpu get Name /Format:list | more | findstr .
      wmic computersystem get NumberofProcessors /Format:list | more | findstr .
    
      echo(
      echo NIC Information:
      wmic nicconfig where IPEnabled=TRUE get ipaddress, macaddress,defaultipgateway /format:list | more | findstr .
    )
    


    ------------------------------

    The remaining solutions are all properly formatted, without any extra <CR>

    2) Write WMIC output to a temp file, followed by TYPE

    The temp file is in Unicode format, and TYPE properly converts the Unicode to ANSII. I still pipe the result to FINDSTR to eliminate blank lines.

    @echo OFF
    >test2.txt (
      echo Manufacturer Information:
      systeminfo|findstr /c:"Host Name" /c:"OS Name" /c:"System Model:" /c:"System Type:" /c:"Total Physical Memory:"
    
      echo(
      echo CPU Information:
      call :wmic cpu get Name /Format:list
      call :wmic computersystem get NumberofProcessors /Format:list
    
      echo(
      echo NIC Information:
      call :wmic nicconfig where IPEnabled=TRUE get ipaddress, macaddress,defaultipgateway /format:list
    )
    exit /b
    
    :wmic
    wmic %* >test.tmp
    type test.tmp | findstr .
    del test.tmp
    exit /b
    


    3) Run WMIC through two FOR /F loops.

    The first FOR /F converts the WMIC output to ANSII, but it has the extra <CR> at the end of each line. The second FOR /F strips off the unwanted trailing <CR>. FOR /F automatically strips blank lines.

    @echo OFF
    >test3.txt (
      echo Manufacturer Information:
      systeminfo|findstr /c:"Host Name" /c:"OS Name" /c:"System Model:" /c:"System Type:" /c:"Total Physical Memory:"
    
      echo(
      echo CPU Information:
      call :wmic cpu get Name /Format:list
      call :wmic computersystem get NumberofProcessors /Format:list
    
      echo(
      echo NIC Information:
      call :wmic nicconfig where IPEnabled=TRUE get ipaddress, macaddress,defaultipgateway /format:list
    )
    exit /b
    
    :wmic
    for /f "delims=" %%A in ('"wmic %*"') do for /f "delims=" %%B in ("%%A") do echo %%B
    exit /b