Batch file 如何在文本文件上格式化批处理命令结果

Batch file 如何在文本文件上格式化批处理命令结果,batch-file,Batch File,我正在使用下面的批处理脚本检索计算机信息 ( systeminfo | findstr /c:"Host Name" /c:"Domain" /c:"OS Name" /c:"OS Version" /c:"System Manufacturer" /c:"System Model" /c:"System type" /c:"Total Physical Memory" /c:"Available Physical Memory" wmic bios get serialnu

我正在使用下面的批处理脚本检索计算机信息

(
    systeminfo | findstr /c:"Host Name" /c:"Domain" /c:"OS Name" /c:"OS Version" /c:"System Manufacturer" /c:"System Model" /c:"System type" /c:"Total Physical Memory" /c:"Available Physical Memory" 

    wmic bios get serialnumber

) > "getPCinfo.txt"
然后文本文件上的结果是

Host Name:                 Host
OS Name:                   Microsoft Windows 10 Pro
OS Version:                10.0.16299 N/A Build 16299
System Manufacturer:       Dell Inc.
System Model:              Latitude 7480
BIOS Version:              Dell Inc. 1.7.3, 10/11/2017
Total Physical Memory:     8,077 MB
Available Physical Memory: 2,450 MB
Domain:                    Domain.Domain.Domain.net
S e r i a l N u m b e r     

 3 R K 5 M H 2               
我可以知道如何将序列号格式化为与先前信息相同的格式,如:-

S e r i a l N u m b e r :   3 R K 5 M H 2  

这应该对你有用

@echo off

systeminfo | findstr /c:"Host Name" /c:"Domain" /c:"OS Name" /c:"OS Version" /c:"System Manufacturer" /c:"System Model" /c:"System type" /c:"Total Physical Memory" /c:"Available Physical Memory">"getPCinfo.txt"

FOR /F "tokens=1,2 delims==" %%G IN ('wmic bios get serialnumber /value ^|find /I "serialnumber"') DO >>"getPCinfo.txt" echo %%G :   %%H

这应该对你有用

@echo off

systeminfo | findstr /c:"Host Name" /c:"Domain" /c:"OS Name" /c:"OS Version" /c:"System Manufacturer" /c:"System Model" /c:"System type" /c:"Total Physical Memory" /c:"Available Physical Memory">"getPCinfo.txt"

FOR /F "tokens=1,2 delims==" %%G IN ('wmic bios get serialnumber /value ^|find /I "serialnumber"') DO >>"getPCinfo.txt" echo %%G :   %%H

这是一个字符编码问题:
systeminfo
返回ASCII/ANSI文本,但
wmic
返回Unicode文本

已经展示了一种将
wmic
输出转换为ASCII/ANSI文本的方法,尽管为了避免像孤立回车(CR)字符这样的转换人工制品,我会以稍微不同的方式编写:

systeminfo | findstr/c:“主机名”/c:“域”/c:“操作系统名”/c:“操作系统版本”/c:“系统制造商”/c:“系统型号”/c:“系统类型”/c:“总物理内存”/c:“可用物理内存”>“getPCInfo.txt”
对于/F“delims=“%%H in('wmic BIOS get SerialNumber/VALUE')do for/F”令牌=1*delims==“%%I in(%%H”)do>>“getPCInfo.txt”echo%%I:%%J

无论如何,这里有另一种使用临时文件的方法:

systeminfo | findstr/c:“主机名”/c:“域”/c:“操作系统名”/c:“操作系统版本”/c:“系统制造商”/c:“系统型号”/c:“系统类型”/c:“总物理内存”/c:“可用物理内存”>“getPCInfo.txt”
wmic bios获取serialnumber/VALUE>“getPCInfo.tmp”
键入“getPCInfo.tmp”>>“getPCInfo.txt”
删除“getPCInfo.tmp”

仅当宿主
cmd
实例未在Unicode模式下运行时(请参见其
/U
选项),但默认值仍然是ASCII/ANSI(
/A
)。这是一个字符编码问题:
systeminfo
返回ASCII/ANSI文本,但
wmic
返回Unicode文本

已经展示了一种将
wmic
输出转换为ASCII/ANSI文本的方法,尽管为了避免像孤立回车(CR)字符这样的转换人工制品,我会以稍微不同的方式编写:

systeminfo | findstr/c:“主机名”/c:“域”/c:“操作系统名”/c:“操作系统版本”/c:“系统制造商”/c:“系统型号”/c:“系统类型”/c:“总物理内存”/c:“可用物理内存”>“getPCInfo.txt”
对于/F“delims=“%%H in('wmic BIOS get SerialNumber/VALUE')do for/F”令牌=1*delims==“%%I in(%%H”)do>>“getPCInfo.txt”echo%%I:%%J

无论如何,这里有另一种使用临时文件的方法:

systeminfo | findstr/c:“主机名”/c:“域”/c:“操作系统名”/c:“操作系统版本”/c:“系统制造商”/c:“系统型号”/c:“系统类型”/c:“总物理内存”/c:“可用物理内存”>“getPCInfo.txt”
wmic bios获取serialnumber/VALUE>“getPCInfo.tmp”
键入“getPCInfo.tmp”>>“getPCInfo.txt”
删除“getPCInfo.tmp”

仅当宿主
cmd
实例未在Unicode模式下运行时(请参见其
/U
选项),但默认值为ASCII/ANSI(
/A
)时,此选项才起作用。

我不喜欢脚本中的行太长-您太快了。
此批处理使用findstr的默认正则表达式模式,锚定在以
/B

并用点替换搜索字符串中的空格

:: Q:\Test\2018\06\22\Get-PCInfo.cmd
@Echo off
FOR /F "tokens=1,2 delims==" %%A IN ('
  wmic bios get serialnumber /value ^|find /I "serialnumber"
') DO For %%C in (%%B) Do Set "BIOS=%%A:              %%C"

Set "Find=Host.Name Domain OS.Name OS.Version System.Manufacturer"
Set "Find=%Find% System.Model System.type Total.Physical.Memory"
Set "Find=%Find% BIOS.Version Available.Physical.Memory"

( systeminfo | findstr /I /B "%Find%"
  Echo=%BIOS%
) >getPCinfo.txt
样本输出:

> type getPCinfo.txt
Host Name:                 HOST
OS Name:                   Microsoft Windows 10 Pro
OS Version:                10.0.16299 N/A Build 16299
System Manufacturer:       System manufacturer
System Model:              System Product Name
System Type:               x64-based PC
BIOS Version:              American Megatrends Inc. 1408   , 09/21/2010
Total Physical Memory:     24.566 MB
Available Physical Memory: 14.753 MB
Domain:                    Doamin
SerialNumber:              Number

我不喜欢脚本中有太长的行,因为您太快就失去了概述。
此批处理使用findstr的默认正则表达式模式,锚定在以
/B

并用点替换搜索字符串中的空格

:: Q:\Test\2018\06\22\Get-PCInfo.cmd
@Echo off
FOR /F "tokens=1,2 delims==" %%A IN ('
  wmic bios get serialnumber /value ^|find /I "serialnumber"
') DO For %%C in (%%B) Do Set "BIOS=%%A:              %%C"

Set "Find=Host.Name Domain OS.Name OS.Version System.Manufacturer"
Set "Find=%Find% System.Model System.type Total.Physical.Memory"
Set "Find=%Find% BIOS.Version Available.Physical.Memory"

( systeminfo | findstr /I /B "%Find%"
  Echo=%BIOS%
) >getPCinfo.txt
样本输出:

> type getPCinfo.txt
Host Name:                 HOST
OS Name:                   Microsoft Windows 10 Pro
OS Version:                10.0.16299 N/A Build 16299
System Manufacturer:       System manufacturer
System Model:              System Product Name
System Type:               x64-based PC
BIOS Version:              American Megatrends Inc. 1408   , 09/21/2010
Total Physical Memory:     24.566 MB
Available Physical Memory: 14.753 MB
Domain:                    Doamin
SerialNumber:              Number

这是一个未经测试的PowerShell版本,只是因为systeminfo需要多长时间:

PCInfo.ps1

$Properties=@{
主机名=(GWMI Win32操作系统).CSName
OS_Name=(GWMI Win32_OperatingSystem)。标题
OS_Version=GWMI Win32_操作系统|%{$\u.Version+'build'+$\u.BuildNumber}
系统\制造商=(GWMI Win32 \计算机系统)。制造商
System_Model=(GWMI Win32_Computersystem).Model
BIOS_版本=(GWMI Win32_BIOS)。SMBIOS版本
总物理内存=GWMI Win32物理内存|测量容量-总和|%{[String]$([Math]::四舍五入($.Sum/1MB),0))+'MB'}
可用的物理内存=GWMI Win32操作系统|%{[String]$([Math]::Round($.FreePhysicalMemory*1KB/1MB),0))+'MB'}
Domain=GWMI Win32_Computersystem |%{$\.DNSHostName+'.+$\.Domain}
序列号=(GWMI Win32_BIOS).SerialNumber}
$ColumnWidth=($Properties.Keys | Measure-最大长度)。最大值
$Properties.GetEnumerator()|排序名称|%{{{0,-$ColumnWidth}:{1}“-F$_.Key,$_.Value}
要运行它,请根据需要更改路径,并在命令提示下输入以下内容:

PowerShell-NoP-ExecutionPolicy RemoteSigned-File“C:\Users\YHTAN\Desktop\PCInfo.ps1”>“C:\Users\YHTAN\Desktop\PCInfo.txt”

这是一个未经测试的PowerShell版本,只是因为systeminfo需要多长时间:

PCInfo.ps1

$Properties=@{
主机名=(GWMI Win32操作系统).CSName
OS_Name=(GWMI Win32_OperatingSystem)。标题
OS_Version=GWMI Win32_操作系统|%{$\u.Version+'build'+$\u.BuildNumber}
系统\制造商=(GWMI Win32 \计算机系统)。制造商
System_Model=(GWMI Win32_Computersystem).Model
BIOS_版本=(GWMI Win32_BIOS)。SMBIOS版本
总物理内存=GWMI Win32物理内存|测量容量-总和|%{[String]$([Math]::四舍五入($.Sum/1MB),0))+'MB'}
可用的物理内存=GWMI Win32操作系统|%{[String]$([Math]::Round($.FreePhysicalMemory*1KB/1MB),0))+'MB'}
Domain=GWMI Win32_Computersystem |%{$\.DNSHostName+'.+$\.Domain}
序列号=(GWMI Win32_BIOS).SerialNumber}
$ColumnWidth=($Properties.Keys | Measure-最大长度)。最大值
$Properties.GetEnumerator()|排序名称|%{{{0,-$ColumnWidth}:{1}“-F$_.Key,$_.Value}
要运行它,请根据需要更改路径,并在命令提示下输入以下内容:

PowerShell-NoP-ExecutionPolicy RemoteSigned-Fi