这段代码如何运作? (windows批处理)

时间:2015-01-22 21:04:39

标签: file batch-file dir

@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

我在网站上看到这个并且它运行得很好,但是我试图将它合并到我自己的代码中,但是每当我修改它时,它都无法正常工作。有人请向我解释,以便我可以自己使用它。

1 个答案:

答案 0 :(得分:0)

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个令牌,一个有五个令牌。我们只想要第一个,即带有4个令牌的行,该行具有该文件夹下所有文件的大小。

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

size

当我们在一个代码块中工作时,要检索变量中的更改值,我们需要延迟扩展以回显setlocal enabledelayedexpansion echo(%%~nxa # !size! endlocal 变量,以及正在迭代的文件夹的名称和扩展名。