如何在批处理脚本中以整数格式输出filesize

时间:2017-08-22 05:09:36

标签: windows batch-file scripting

我正在尝试遍历文件夹中的文件并获取大于100MB的所有文件。

现在,如果我这样做,我可以获得以字节为单位输出的文件大小:

for %%f in (%FOLDER_PATH%\*) do (
  set /p val=<%%f
  echo %%~z%f
)

虽然我可以回显该值,但我无法将其分配给变量或与其进行比较:

for %%f in (%FOLDER_PATH%\*) do (
  set /p val=<%%f

  if %%~z%f GTR 104857600(
  echo file meets criteria
  )
)

上面的代码返回: The syntax of the command is incorrect.

2 个答案:

答案 0 :(得分:2)

除了z和f之间多余的%,您的代码才有效。

从文件%% f获取第一行内容,然后不使用此var让我感到困惑。

for %%f in (%FOLDER_PATH%\*) do (
    set /p val=<%%f

    Echo %%f:1:!val!

    if %%~zf GTR 104857600(
        echo file meets criteria
    )
)

答案 1 :(得分:0)

为什么当前文件的第一行用命令行set /p val=<%%f分配给环境变量val如果该任务只是为了查找并以某种方式处理文件大小超过文件大小的指定文件夹中的文件100 MiB

语法错误在%%~z%f中,因为代码中的循环变量为f,并且引用分配给此循环变量的文件的文件大小的修饰符为~z。使用修饰符来获取文件大小的循环变量f的正确引用是%%~zf

嗯,小写f对于循环变量来说是个不错的选择,因为还有~f,它是用完整路径引用文件的整个名称(文件名+扩展名)的修饰符。 %%~f可以被Windows命令解释器解释为循环变量f的引用值,其中删除了周围的双引号,或者作为具有修饰符~f的不完整循环变量引用,用于缺少完整路径的文件名循环变量。

循环变量与区分大小写的环境变量相比较。因此,通常最好使用大写字母作为循环变量,以避免与使用小写的修饰符混淆。

此代码显示如何使用循环变量I引用文件名及其文件大小。

@echo off
if not defined FOLDER_PATH set "FOLDER_PATH=%SystemRoot%"
for %%I in ("%FOLDER_PATH%\*") do (
    echo File "%%~I" has a file size of %%~zI bytes.
    if %%~zI GTR 104857600 echo File "%%~I" is greater 100 MiB.
)
set "FOLDER_PATH="

可以使用set "FileSize=%%~zI"将文件大小分配给环境变量。

但是在为一个环境变量赋值时,该环境变量在以(开头并以匹配)开头的同一命令块中引用,因此需要使用delayed expansion,因为Windows命令解释器会替换在运行 FOR 命令之前,所有%variable%环境变量引用已由当前值variable引用。因此,在循环执行期间,所有%variable%环境变量引用都不会更新。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
if not defined FOLDER_PATH set "FOLDER_PATH=%SystemRoot%"
for %%I in ("%FOLDER_PATH%\*") do (
    set "FileSize=%%~zI"
    if !FileSize! GTR 104857600 echo File "%%~I" is greater 100 MiB.
)
endlocal

使用感叹号而不是百分号来引用环境变量FileSize以使用在批处理文件顶部启用的延迟扩展,因为默认情况下仅启用命令扩展。 IF 命令的GTR运算符也需要命令扩展名。

但请注意,上面发布的两个批处理文件都不适用于具有2 GiB或更多的文件,因为Windows命令解释程序仅支持32位有符号整数。在运行 IF 命令之前,需要额外的代码来确定文件是否大于2 GiB。好吧,在这种情况下,这很容易实现,因为任何文件大小超过9位的文件肯定都大于100 MiB。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
if not defined FOLDER_PATH set "FOLDER_PATH=%SystemRoot%"
for %%I in ("%FOLDER_PATH%\*") do (
    echo File "%%~I" has a file size of %%~zI bytes.
    set "FileSize=%%~zI"
    if not "!FileSize:~9!" == "" (
        echo File "%%~I" is greater 100 MiB.
    ) else if !FileSize! GTR 104857600 (
        echo File "%%~I" is greater 100 MiB.
    )
)
endlocal

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • set /?
  • setlocal /?