此代码如何工作? (windows 批次)

How Does This Code Work? (windows batch)

@echo off
setlocal disabledelayedexpansion

set "folder=%~1"
if not defined folder set "folder=%cd%"

for /d %%a in ("%folder%\*") do (
    set "size=0"
    for /f "tokens=3,5" %%b in ('dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:"  "') do if "%%~c"=="" set "size=%%~b"
    setlocal enabledelayedexpansion
    echo(%%~nxa # !size!
    endlocal
)

pause

我在网站上读到它,它工作得很好,但我试图将它合并到我自己的代码中,但是每当我修改它时,它就是不起作用。有人请给我解释一下,这样我就可以自己使用了。

set "folder=%~1"
if not defined folder set "folder=%cd%"

获取作为参数传递的指定文件夹,或者如果没有参数,则使用当前文件夹

for /d %%a in ("%folder%\*") do (

对于指定文件夹下的每个文件夹

for /f "tokens=3,5" %%b in ('
    dir /-c /a /w /s "%%~fa\*" 2^>nul ^| findstr /b /c:"  "
') do if "%%~c"=="" set "size=%%~b"

对指定文件夹的所有内容执行递归dir命令,搜索以两个空格开头的行,即dir命令的脚注行。有两行,一行有 4 个标记,一行有 5 个标记。我们只想要第一个,即 4 个标记的行,文件夹下所有文件大小的行。

至于每个文件夹(它是一个递归目录)都会有一个页脚行,我们只对最后一个感兴趣,所以我们将大小值(行中的第三个标记)存储在 size变量。这样,最后,变量将包含列表的最终总数。

setlocal enabledelayedexpansion
echo(%%~nxa # !size!
endlocal

当我们在代码块中工作时,为了检索变量中的更改值,我们需要延迟扩展以回显 size 变量,以及正在迭代的文件夹的名称和扩展名。