2015-07-19 68 views
1

我的.bat脚本,打印第一等号前值到一个.txt文件:如何从产值删除BOM

.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 (
    echo %%I 
) 

因为.txt文件是BOM,我的价值输出总是具有独特的性格BOM:

'!1986 

回答

0

我不知道为什么在运行批处理文件时会得到'!1986的输出。

与BOM EF BB EF的UTF-8编码的文本文件(根据我的语言和区域设置西欧代码页)使用OEM code page 850与代码页显示为Windows-1252导致输出´╗┐1986在控制台窗口。

用UTF-16 Little Endian编码的BOM FF FE的文本文件导致输出1986。如果文本文件是使用UTF-16 Big Endian编码的BOM FE 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=" 
:CheckFirstChar 
if "!Digits:%Value:~0,1%=!" NEQ "%Digits%" goto:EOF 
set "Value=!Value:~1!" 
if "!Value!" == "" goto :EOF 
goto CheckFirstChar 

子程序GetValue从值字符串中删除BOM字符。

有关如何检查作为数字的环境变量Value的第一个字符的说明,请参阅How to check a string does not start with a number in batch?

set "Value=!Value:~1!"分配给ValueValue的当前字符串,但索引为0的字符除外,即除了第一个字符以外的所有字符(绝对不是数字)。在命令提示符窗口set /?中运行并阅读输出帮助以了解此语法。

该子程序以goto :EOFValue的第一个字符上退出是一个数字,或者如果字符串在字符串为空的情况下变为空,则第一个等号不包含任何数字。

0

一个简单的方法来做到这一点(如果它工作的话)是将BOM的末尾添加到delims列表中。运行您的type命令,并在“1986”之前将打印的字符复制到控制台。然后将其粘贴到delims=行的源代码中。

for /f "tokens=2 delims==┐" %i in (mokedbi.txt) do echo %i 

然后改变你的tokens=到2 DELIM后能得到未来的事情。

+0

这是我的第一个想法。但是由于[edwio]发布的输出(http://stackoverflow.com/users/5035880/edwio)对于使用UTF-8 BOM的文本文件看起来不正确,我放弃了它。第二种解决方案取决于批处理文件的命令提示符窗口中已使用的代码页。它仅在'┐'具有十六进制代码值'BF'的情况下有效。我的解决方案在使用的代码页上独立于只使用ASCII字符。 – Mofi

+0

@Mofi同意这是一个脆弱的解决方案,但它的优点是简单和快速实施。你在无头或生产环境中肯定会更好。从OP问题是否要进行容错或快速简单的问题来看,这并不清楚。 –