一个Windows批处理文件如何检测一个文件是否大于0字节?

3

我有一个在Visual Studio工具链中使用的Windows批处理文件,它会创建一个特定目录中的文件列表,然后使用"findstr"来缩小此列表,仅列出文件名包含特定字符串的文件;然后对这些文件进行一些操作。

dir /b \mypath\*.wav >wavRawList.txt

findstr /b /v "DesiredString" wavRawList.txt >wavListWithDesiredString.txt

for /f %%a in (wavListWithDesiredString.txt) do (

  [... do some stuff ...]

)

Visual Studio 经常会从这个批处理文件中报告错误,我认为这是因为 wavListWithDesiredString.txt 经常以长度为 0 的文件结束。是否有一种“如果存在 wavListWithDesiredString.txt”的方式,而不是“存在”,我可以替换一个命令,意思是“如果它存在且文件长度大于 0”?

3个回答

7

使用 for 的几乎内联方式:

for %%x in (wavListWithDesiredString.txt) do if not %%~zx==0 (
    ...
)

或者您可以使用子例程:

:size
set SIZE=%~z1
goto :eof

您可以这样调用:

call :size wavListWithDesiredString.txt
if not %SIZE%==0 ...

1
IF EXIST %1 IF %~z1 GTR 0 ECHO Both conditions are satisfied.

无法工作,因为如果文件不存在,这部分:"IF %~z1 GTR 0" 将解析为 "IF GTR 0",这是无效的命令,并导致以下结果:

0 was unexpected at this time.

延迟扩展也无济于事。要修复,请使用以下方法:
if exist %1 (
    echo "Ouput file exists, checking size"
    for %%x in (%1) do if not %%~zx==0 (
        echo "File exists, size is non zero"
        ... DO SOMETHING ...
    ) else (
        echo "Size is zero"
    )
) else (
    echo "There is no file"
)

0

我能够通过这里找到的另一个堆栈溢出问题解决问题中的文件大小部分。我会使用嵌套来模拟如下示例的AND运算符:

IF EXIST %1 IF %~z1 GTR 0 ECHO Both conditions are satisfied.

%1是必须传递到批处理文件中的参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接