如何从输出值中删除BOM

时间:2015-07-19 14:29:37

标签: batch-file text byte-order-mark

我有.bat脚本,它将第一个等号前的值打印到.txt文件中:

.txt文件:

<html>
<head>
</head>
<body>
    <table border="0" width="100%" cellspacing="0" cellpadding="0">
        <tbody>
            <tr>
                <td valign="top" width="325">
                    <select multiple="" size="10" style="overflow-x:auto; overflow-y:auto; width:320px;">
                        <option value="a1">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</option>
                        <option value="b1">bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb</option>
                    </select>
                </td>
            </tr>
        </tbody>
    </table>
</body>
</html>

.bat脚本:

1986=[TotalItemSize: 793.4 MB (831,989,085 bytes)]=[IssueWarningQuota: 5.039 GB (5,410,652,160 bytes)]

由于.txt文件带有BOM,因此我的值输出始终具有唯一的BOM字符:

@echo off
for /f  "tokens=1 delims==" %%I in ('type C:\Users\edwio\Desktop\edwio_Test\mokedbi.txt') do (
    echo %%I
)

2 个答案:

答案 0 :(得分:0)

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

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

使用带有BOM FF FE的UTF-16 Little Endian编码的文本文件会生成输出1986。如果文本文件使用带有BOM FE FF的UTF-16 Big Endian进行编码,则输出完全无用,而无需使用命令 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字符。

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

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

子例程以goto :EOF的第一个字符退出,Value是一个数字,或者如果字符串变为空,如果字符串留给第一个等号,则不包含任何数字。

答案 1 :(得分:0)

执行此操作的简单方法(如果可行)是将BOM的末尾添加到delims列表。运行type命令,然后在#1986; 1986&#34;之前将打印出的字符复制到控制台。然后将其粘贴到delims=行的源代码中。

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

然后将tokens=更改为2,以便在分隔后获得下一个内容。