【问题标题】:Difference size from two folders in batch批量两个文件夹的大小差异
【发布时间】:2021-10-06 14:54:14
【问题描述】:

我会在两个文件夹之间做大小差异。

这是我的批处理代码

@echo off
setlocal ENABLEDELAYEDEXPANSION
set firstline=.
set firstline2=.
set secondline=.
set secondline2=.
::GET SIZE FIRST FOLDER
@FOR /F "tokens=1 delims=^^" %%G IN ('dir  /a /s  "C:\Program files\"') DO (
   set firstline=!secondline!
   set secondline=%%G
)
::GET SIZE SECOND FOLDER
@FOR /F "tokens=1 delims=^^" %%G IN ('dir  /a /s  "C:\Temp\"') DO (
   set firstline2=!secondline2!
   set secondline2=%%G
)
echo !firstline!   ---->   8528 File(s)  3,767,627,449 bytes
echo !firstline2!  ---->     16 File(s)     37,620,834 bytes

::DO BYTES DIFFERENCE
set difference = !firstline! - !firstline2!

我怎样才能在“firstline”和“firstline2”上只获取字节值,这样我才能有所作为?

谢谢

【问题讨论】:

  • Mmmm... 你需要得到这样一个字符串的适当部分,可能用for /F 命令和tokens=3 开关,然后用%var:,=% 替换消除逗号。但是,如果您想对大于 2147483647 的数字进行差分(即set /A 命令可以管理的最大数字),那么您需要一种方法来管理批处理文件中的大数字,例如 this one
  • 对不起,我是批处理语言的新手,请您建议我如何只取字节值,解释部分代码?对于大数字的差异,这不是问题,因为我可以将字节转换为兆字节 (n/1024) 或千兆字节 (n/1024/1024)
  • 我已经给了你一系列的提示,所以请阅读for /F命令和“变量替换”的文档,写一个批处理文件,如果你有问题返回这里。您打算如何将 3767627449 字节转换为兆字节?使用set /A 命令?

标签: batch-file


【解决方案1】:

以下想法应该为您提供您需要的信息,即字节数差异。

@Echo Off
SetLocal EnableExtensions

Set "First="
Call :DirSize First "C:\Program Files"
If Not Defined First GoTo :EOF

Set "Second="
Call :DirSize Second "C:\Temp"
If Not Defined Second GoTo :EOF

Set /A Diff = First - Second

Echo %Diff:-=%
Pause

GoTo :EOF

:DirSize
For %%G In ("%~2") Do If "%%~aG" GEq "d" For /F "EOL=- Tokens=3,8" %%H In ('
 %SystemRoot%\System32\robocopy.exe "%~2" Null /Bytes /L /NDL /NFL /NJH /S'
) Do If Not "%%I" == "" Set "%~1=%%H"
Exit /B

在上述情况下,检索仅包含目录大小(以字节为单位)的字符串的代码位于标记部分:DirSize

请注意,如果任一目录的大小大于 2147483647 字节,上述代码将无法按预期完成任务。不过,顺便说一句,如果可能出现这种情况,您可以对标记的部分进行调整:

:DirSize
For %%G In ("%~2") Do If "%%~aG" GEq "d" For /F "EOL=- Tokens=3,8" %%H In ('
 %SystemRoot%\System32\robocopy.exe "%~2" Null /L /NDL /NFL /NJH /S'
) Do If Not "%%I" == "" Set "%~1=%%H"
Exit /B

删除/bytes 选项意味着您返回的变量将是一个以MB 为单位的潜在浮点字符串,(可能最多保留两位小数)。然后您需要做的是根据需要调整/拆分这些变量,并修改您的算术,(因为Set /A 不适用于浮点数,仅适用于整数)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多