Batch file 如何从输出值中删除BOM表
我有一个.bat脚本,它将第一个等号之前的值打印到一个.txt文件中: .txt文件:Batch file 如何从输出值中删除BOM表,batch-file,text,byte-order-mark,Batch File,Text,Byte Order Mark,我有一个.bat脚本,它将第一个等号之前的值打印到一个.txt文件中: .txt文件: 1986=[TotalItemSize: 793.4 MB (831,989,085 bytes)]=[IssueWarningQuota: 5.039 GB (5,410,652,160 bytes)] @echo off for /f "tokens=1 delims==" %%I in ('type C:\Users\edwio\Desktop\edwio_Test\mokedbi.txt') do
1986=[TotalItemSize: 793.4 MB (831,989,085 bytes)]=[IssueWarningQuota: 5.039 GB (5,410,652,160 bytes)]
@echo off
for /f "tokens=1 delims==" %%I in ('type C:\Users\edwio\Desktop\edwio_Test\mokedbi.txt') do (
echo %%I
)
.bat脚本:
1986=[TotalItemSize: 793.4 MB (831,989,085 bytes)]=[IssueWarningQuota: 5.039 GB (5,410,652,160 bytes)]
@echo off
for /f "tokens=1 delims==" %%I in ('type C:\Users\edwio\Desktop\edwio_Test\mokedbi.txt') do (
echo %%I
)
由于.txt文件包含BOM,因此我的值输出始终具有唯一的BOM字符:
'!1986
我不知道你为什么得到
!1986运行批处理文件时的输出
带有BOMEF BB EF
的UTF-8编码文本文件显示为ï»
,带有代码页,输出结果为╗┐1986
在控制台窗口中使用(西欧代码页根据我的语言和区域设置)
使用UTF-16 Little-Endian编码的文本文件与BOMFF FE
一起输出1986
。如果文本文件使用UTF-16 Big-Endian编码,并带有BOMFE FF
,则如果不使用命令chcp切换代码页,输出将完全无效
然而,这里有一个批处理代码,它从第一个等号左边的字符串中删除第一位左边的所有字符
@echo off
setlocal EnableDelayedExpansion
for /f "usebackq tokens=1 delims==" %%I in ("%USERPROFILE%\Desktop\edwio_Test\mokedbi.txt") do (
call :GetValue "%%I"
if "!Value!" NEQ "" echo !Value!
)
endlocal
rem Exit the batch file.
goto :EOF
:GetValue
set "Value=%~1"
set "Digits=0123456789"
:CheckFirstChar
if "!Digits:%Value:~0,1%=!" NEQ "%Digits%" goto:EOF
set "Value=!Value:~1!"
if "!Value!" == "" goto :EOF
goto CheckFirstChar
子例程GetValue
从值字符串中删除BOM表字符
有关如何检查环境变量值的第一个字符作为数字的说明,请参见
行set“Value=!Value:~1!”
将Value
的当前字符串指定给Value
,索引0处的字符除外,即除第一个绝对不是数字的字符外的所有字符。在命令提示窗口中运行set/?
,阅读输出帮助以理解此语法
子例程退出时,值中的第一个字符上的goto:EOF
是一个数字,或者如果第一个等号前的字符串不包含任何数字,则字符串变为空。我不知道为什么会得到!1986运行批处理文件时的输出
带有BOMEF BB EF
的UTF-8编码文本文件显示为ï»
,带有代码页,输出结果为╗┐1986
在控制台窗口中使用(西欧代码页根据我的语言和区域设置)
使用UTF-16 Little-Endian编码的文本文件与BOMFF FE
一起输出1986
。如果文本文件使用UTF-16 Big-Endian编码,并带有BOMFE FF
,则如果不使用命令chcp切换代码页,输出将完全无效
然而,这里有一个批处理代码,它从第一个等号左边的字符串中删除第一位左边的所有字符
@echo off
setlocal EnableDelayedExpansion
for /f "usebackq tokens=1 delims==" %%I in ("%USERPROFILE%\Desktop\edwio_Test\mokedbi.txt") do (
call :GetValue "%%I"
if "!Value!" NEQ "" echo !Value!
)
endlocal
rem Exit the batch file.
goto :EOF
:GetValue
set "Value=%~1"
set "Digits=0123456789"
:CheckFirstChar
if "!Digits:%Value:~0,1%=!" NEQ "%Digits%" goto:EOF
set "Value=!Value:~1!"
if "!Value!" == "" goto :EOF
goto CheckFirstChar
子例程GetValue
从值字符串中删除BOM表字符
有关如何检查环境变量值的第一个字符作为数字的说明,请参见
行set“Value=!Value:~1!”
将Value
的当前字符串指定给Value
,索引0处的字符除外,即除第一个绝对不是数字的字符外的所有字符。在命令提示窗口中运行set/?
,阅读输出帮助以理解此语法
子例程退出时,Value
中的第一个字符上的goto:EOF
是一个数字,或者如果第一个等号前的字符串不包含任何数字,则字符串变为空。一个简单的方法是将BOM的末尾添加到delims
列表中。运行type
命令,并将打印出的字符复制到“1986”之前的控制台上。然后将其粘贴到源代码的delims=
行中
for /f "tokens=2 delims==┐" %i in (mokedbi.txt) do echo %i
然后将您的tokens=
更改为2,以获得delim之后的下一件事。一个简单的方法是将BOM的末尾添加到delims
列表中。运行type
命令,并将打印出的字符复制到“1986”之前的控制台上。然后将其粘贴到源代码的delims=
行中
for /f "tokens=2 delims==┐" %i in (mokedbi.txt) do echo %i
然后将您的tokens=
更改为2,以获得delim之后的下一个内容。这是我的第一个想法。但是我删除了它,因为发布的输出不适合使用UTF-8 BOM的文本文件。其次,该解决方案分别依赖于批处理文件在命令提示符窗口中使用的代码页。仅当┐代码>具有十六进制代码值BF
。我的解决方案在使用的代码页上是独立的,因为它只使用ASCII字符。@Mofi同意这是一个脆弱的解决方案,但它的优点是实现简单且快速。在无头或生产环境中,您的产品肯定会更好。从这个问题上看,不清楚OP是支持容错还是快速简便。这是我的第一个想法。但是我删除了它,因为发布的输出不适合使用UTF-8 BOM的文本文件。其次,该解决方案分别依赖于批处理文件在命令提示符窗口中使用的代码页。仅当┐代码>具有十六进制代码值BF
。我的解决方案在使用的代码页上是独立的,因为它只使用ASCII字符。@Mofi同意这是一个脆弱的解决方案,但它的优点是实现简单且快速。在无头或生产环境中,您的产品肯定会更好。从这个问题上看,OP是支持容错,还是支持快速、简单。