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
windows批处理:如何检查文本文件是否为空(该文件有一个空行,因此大小不为零)_Windows_Batch File - Fatal编程技术网

windows批处理:如何检查文本文件是否为空(该文件有一个空行,因此大小不为零)

windows批处理:如何检查文本文件是否为空(该文件有一个空行,因此大小不为零),windows,batch-file,Windows,Batch File,该文件的问题是,它有时包含一个空行,因此大小不是零。我尝试了这个方法,但是因为它有一个空行,所以它返回1而不是0。有什么建议可以解决吗 set /a varTestPoints=0 for /f %%a in ('type "file.txt"^|find "" /v /c') do set /a varTestPoints=%%a 尺寸可通过以下方式进行检查: 对于file.txt中的%%a,执行echo%%~za 其中%%%~za是%%a引用的文件的大小 要测试文件是否只包含空行,可以使用

该文件的问题是,它有时包含一个空行,因此大小不是零。我尝试了这个方法,但是因为它有一个空行,所以它返回1而不是0。有什么建议可以解决吗

set /a varTestPoints=0
for /f %%a in ('type "file.txt"^|find "" /v /c') do set /a varTestPoints=%%a

尺寸可通过以下方式进行检查:

对于file.txt中的%%a,执行echo%%~za 其中%%%~za是%%a引用的文件的大小

要测试文件是否只包含空行,可以使用以下任何命令

对于/f usebackq^eol^=%%a,file.txt中的do break&&echo具有数据| | echo为空 对于/f usebackq eol=%%a,file.txt中的do break&echo具有数据| | echo为空 如果for/f找不到包含数据的行,则会引发一个错误,可使用&&和| |条件执行运算符进行检查

请注意,在检查空行的原始代码中,/f中跳过以分号开头的行的默认行为将使文件中以;开头的行的测试失败;。现在,代码还通过两种不同的方式处理这种情况

在第一个命令中,通过为eol子句指定一个空列表或分隔符来禁用它

第二个命令为eol分配一个空间。虽然我们似乎只是简单地更改了有问题的字符,但当for/f标记器解析行时,delims子句优先于eol more information,因此在将空格视为eol之前,它们将被删除为分隔符


尺寸可通过以下方式进行检查:

对于file.txt中的%%a,执行echo%%~za 其中%%%~za是%%a引用的文件的大小

要测试文件是否只包含空行,可以使用以下任何命令

对于/f usebackq^eol^=%%a,file.txt中的do break&&echo具有数据| | echo为空 对于/f usebackq eol=%%a,file.txt中的do break&echo具有数据| | echo为空 如果for/f找不到包含数据的行,则会引发一个错误,可使用&&和| |条件执行运算符进行检查

请注意,在检查空行的原始代码中,/f中跳过以分号开头的行的默认行为将使文件中以;开头的行的测试失败;。现在,代码还通过两种不同的方式处理这种情况

在第一个命令中,通过为eol子句指定一个空列表或分隔符来禁用它

第二个命令为eol分配一个空间。虽然我们似乎只是简单地更改了有问题的字符,但当for/f标记器解析行时,delims子句优先于eol more information,因此在将空格视为eol之前,它们将被删除为分隔符


一个只有一个空行的文件将有2个字节长的CR,LF。您可以通过检查总文件大小是否小于或等于2来检测此问题

for %%a in (file.txt) do if %%~za LEQ 2 echo File has no more than 2 bytes
这可能不适用于具有更多文本的其他文件,但仍然完全由空白组成,因此显示为空。例如,一个包含单个制表符和换行符的文件将有3个字节。您可以调整空白文件的定义,并相应地修改代码

如果您对空文件的定义是只包含空格的文件,而不管其长度如何,上述解决方案将不起作用。相反,您可以使用for/F来解析文件。读取文件时,“for/F”仅匹配包含非空白字符的行。如果找到一个,则该文件不是空的

set "fileIsBlank=1"
for /F %%a in (file.txt) do set "fileIsBlank=0"
if %fileIsBlank% EQU 0 echo File has non-blank lines in it..

一个只有一个空行的文件将有2个字节长的CR,LF。您可以通过检查总文件大小是否小于或等于2来检测此问题

for %%a in (file.txt) do if %%~za LEQ 2 echo File has no more than 2 bytes
这可能不适用于具有更多文本的其他文件,但仍然完全由空白组成,因此显示为空。例如,一个包含单个制表符和换行符的文件将有3个字节。您可以调整空白文件的定义,并相应地修改代码

如果您对空文件的定义是只包含空格的文件,而不管其长度如何,上述解决方案将不起作用。相反,您可以使用for/F来解析文件。读取文件时,“for/F”仅匹配包含非空白字符的行。如果找到一个,则该文件不是空的

set "fileIsBlank=1"
for /F %%a in (file.txt) do set "fileIsBlank=0"
if %fileIsBlank% EQU 0 echo File has non-blank lines in it..

谢谢你的快速回复。但由于文件包含一个空行,因此大小显示为2 KB,而不是1 KB0@bob,对不起,我以为是反问题。答案更新如果一个文件包含一行以;;开头,恐怕for/F方法会失败;;for/F不会遍历仅限分隔符的行,因此添加eol=选项a空格就可以了…谢谢!或者,也可以通过隐藏在delims后面来禁用eol选项,这意味着其中一个分隔符也被指定为eol,因此在这种情况下,usebackq eol=空格将起作用,因为默认分隔符是tab+空格;这避免了这种特殊的未记录语法的需要。。。如果未给出分隔符,则非引号语法是禁用eol的唯一方法。。
@aschipfl,包括在内,谢谢。我必须承认,当我需要禁用eol时,我不会考虑直接使用转义分隔符语法。无论如何,我认为不幸的是,有一个类似级别的文档,据我所知,几乎没有官方使用转义选项和delims条款的优先级。感谢您的快速回复。但由于文件包含一个空行,因此大小显示为2 KB,而不是1 KB0@bob,对不起,我以为是反问题。答案更新如果一个文件包含一行以;;开头,恐怕for/F方法会失败;;for/F不会遍历仅限分隔符的行,因此添加eol=选项a空格就可以了…谢谢!或者,也可以通过隐藏在delims后面来禁用eol选项,这意味着其中一个分隔符也被指定为eol,因此在这种情况下,usebackq eol=空格将起作用,因为默认分隔符是tab+空格;这避免了这种特殊的未记录语法的需要。。。如果未给出分隔符,则非引号语法是禁用eol的唯一方法…@aschipfl,包括在内,谢谢。我必须承认,当我需要禁用eol时,我不会考虑直接使用转义分隔符语法。无论如何,我认为不幸的是,有一个类似级别的文档,据我所知,几乎没有官方使用转义选项和delims子句的优先级。检查此链接重复问题谢谢您的帮助。但这并不能解决我的问题,因为我的文件有一个空行,所以大小不可能为零。请检查此链接的副本。这似乎是同样的问题,有着相似的解决方案。希望此帮助检查此链接重复问题谢谢您的帮助。但这并不能解决我的问题,因为我的文件有一个空行,所以大小不可能为零。请检查此链接的副本。这似乎是同样的问题,有着相似的解决方案。希望这能对汉克斯·瑞安有所帮助。你的建议听起来不错。我也试过这个,看起来效果不错。您认为在report.txt中为/F%%a设置行=0是个好主意吗?Do set/a lines=!台词!+1回显%lines%感谢Ryan为您抽出时间。感谢您的帮助。如果文件包含以;;开头的单行,恐怕for/F方法将失败;;for/F不会遍历仅限分隔符的行,因此添加eol=选项a空格就可以了…谢谢Ryan。你的建议听起来不错。我也试过这个,看起来效果不错。您认为在report.txt中为/F%%a设置行=0是个好主意吗?Do set/a lines=!台词!+1回显%lines%感谢Ryan为您抽出时间。感谢您的帮助。如果文件包含以;;开头的单行,恐怕for/F方法将失败;;for/F不会遍历仅限分隔符的行,因此添加eol=选项a空格就可以了。。。