我要做的是制作一个批处理文件,该文件将递归进入每个文件夹并计算每个文件夹中的文件数。但是,我花了最后一小时尝试各种各样的东西,但它没有用。
我希望输出看起来像: X:Y其中X是文件夹名称,Y是X中的文件数。
setlocal EnableDelayedExpansion
set current=blank
FOR /D %%G in ("*") DO set current=%%G && call:count
:count
set count=0
for %%A in (*) do set /a count+=1
echo !current!:!count!>>"D:\User\Some\Directory\count.txt"
但这不起作用。输出为每个文件夹提供相同的编号。它输出的数字是目录本身的文件数,我认为是问题所在。
具体来说,如果我在C:\User\Example
并且它有三个文件夹,A,B和C,我想要C:\User\Example\A
中的文件数量等等,但它给了我这个号码C:\User\Example
中的文件。希望有道理。
注意:在我的用例中,文件夹不包含子目录。
答案 0 :(得分:3)
一种不同的方法。
<ExtData>Name="DummyName" Value="Garbage"</ExtData>
答案 1 :(得分:2)
这有效:
请注意,您必须整理set current=%%G&& call:count
或current
值为"A "
(尾随空格,不是您想要的)
当您扫描子目录时,您必须在当前目录前加*
@echo off
del count.txt
setlocal EnableDelayedExpansion
set current=blank
FOR /D %%G in ("*") DO set current=%%G&& call:count
goto end
:count
set count=0
for %%A in (!current!\*) do set /a count+=1
echo !current!:!count!>>"count.txt"
:end
答案 2 :(得分:2)
这个问题的答案看起来像是一系列不同的方法来做同样的事情!这是另一个:
@echo off
setlocal EnableDelayedExpansion
for /F "tokens=1,2 delims=\" %%a in ('findstr /M /S "^" *.*') do (
if "%%b" neq "" (
set "name=%%a"
set /A "count[!name: =_!]+=1"
)
)
(for /F "tokens=2,3 delims=[]=" %%a in ('set count[') do (
set "name=%%a"
echo !name:_= !:%%b
)) > count.txt
这种方法看起来很复杂,因为管理文件夹名称中的空格。如果文件夹没有空格,则可以删除6行(和延迟扩展);那就是:
@echo off
setlocal
for /F "tokens=1,2 delims=\" %%a in ('findstr /M /S "^" *.*') do (
if "%%b" neq "" set /A "count[%%a]+=1"
)
(for /F "tokens=2,3 delims=[]=" %%a in ('set count[') do echo %%a:%%b) > count.txt
答案 3 :(得分:0)
以下是处理它的PowerShell脚本:
Get-ChildItem -Path . -Recurse -ErrorAction SilentlyContinue -Force
| Where-Object { $_.Attributes -eq "Directory"}
| ForEach-Object {Write-Host $_.Name, $_.GetFiles().Count }
打印到屏幕,但写入文件很简单。
扫描一直向下。如果您只想要第一层文件夹,请删除“-Recurse”
优点是你正在对真实对象进行实际操作,而不是试图通过解析文本来欺骗操作系统做一些它不是真正想做的事情。
在这里,弄清楚这是做什么应该相对简单,即使你对PowerShell知之甚少(从这条路径获取一个子列表,这些是目录,并为每一个,打印它的名字) ,以及其中的文件数。)