Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何从输出值中删除BOM表_Batch File_Text_Byte Order Mark - Fatal编程技术网

Batch file 如何从输出值中删除BOM表

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

我有一个.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 (
    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运行批处理文件时的输出

带有BOM
EF BB EF
的UTF-8编码文本文件显示为
ï»
,带有代码页,输出结果为
╗┐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=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运行批处理文件时的输出

带有BOM
EF BB EF
的UTF-8编码文本文件显示为
ï»
,带有代码页,输出结果为
╗┐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=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是支持容错,还是支持快速、简单。