Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 对目录中的文件和子文件夹进行批计数_Batch File_Directory - Fatal编程技术网

Batch file 对目录中的文件和子文件夹进行批计数

Batch file 对目录中的文件和子文件夹进行批计数,batch-file,directory,Batch File,Directory,我有100个文件夹,里面有子文件夹 我想计算每个文件夹中有多少子文件夹以及有多少文件。 然后我希望所有文件都在一个txt文件中,包含文件夹的名称、每个文件夹中的子文件夹数以及每个文件夹中的文件数。 我还想在每个专栏的顶部有一个标题。 所以它看起来是这样的: 现在我正在使用这段代码,它几乎可以工作 @echo off FOR /D %%G in ("*") DO ( PUSHD "%%G" FOR /F "delims=" %%H in ('dir /a-d /b * ^|find /

我有100个文件夹,里面有子文件夹 我想计算每个文件夹中有多少子文件夹以及有多少文件。 然后我希望所有文件都在一个txt文件中,包含文件夹的名称、每个文件夹中的子文件夹数以及每个文件夹中的文件数。 我还想在每个专栏的顶部有一个标题。 所以它看起来是这样的: 现在我正在使用这段代码,它几乎可以工作

@echo off
FOR /D %%G in ("*") DO (
   PUSHD "%%G"
   FOR /F "delims=" %%H in ('dir /a-d /b * ^|find /C /V ""')  DO echo %%G %%H>>"..\count.txt" Files
   FOR /F "delims=" %%I in ('dir /a:d /b * ^|find /C /V ""')  DO echo %%G %%I>>"..\count.txt" Folders
 POPD )
它给了我正确的子文件夹 以及文件夹中的正确文件。 我不知道如何把标题放在最上面,也不知道如何让文件数和文件夹数挨在一起。 在我的代码中,它们是一个接一个的


补充问题,你们找到了第一部分的解决方案,现在我想在另一个子文件夹中添加信息,但我不想用两个脚本来完成,我希望所有内容都显示在txt文件中。所以它看起来是这样的:

对齐列需要子字符串,因为它位于(代码块)中,所以需要延迟扩展

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
(Echo Folders            #Sub  #Files   ##Sub ##Files
 FOR /D %%G in (*) DO (
   PUSHD "%%G"
   Set /A "Sub#=Files#=0,SUB##=Files##=0" 
   Set "Folders=%%~G                  "
   FOR /F %%H in ('dir /a-d /b 2^>NUL^|find /C /V "" ') DO Set Files#=%%H
   FOR /F %%I in ('dir /ad  /b 2^>NUL^|find /C /V "" ') DO Set Sub#=%%I
   if !Sub#! gtr 0 (
      FOR /F %%H in ('dir /a-d /b /S 2^>NUL^|find /C /V "" ') DO Set Files##=%%H
      FOR /F %%I in ('dir /ad  /b /S 2^>NUL^|find /C /V "" ') DO Set Sub##=%%I
      Set /A "Files##-=Files#,Sub##-=Sub#"
   )
   Set    "Sub#=       !Sub#!"
   Set  "Files#=       !Files#!"
   Set   "Sub##=       !Sub##!"
   Set "Files##=       !Files##!"
   Echo !Folders:~,15! !Sub#:~-7! !Files#:~-7! !Sub##:~-7! !Files##:~-7!
   POPD 
)) > "count.txt"
start count.txt
样本输出

Folders            #Sub  #Files   ##Sub ##Files
ManagedWinApi         0       5       0       0
vb                    0      16       0       0
PoSh                  9     249       2     181
_StackOverflow        1       0       0       5
@ECHO关闭
SETLOCAL
设置“sp12=”
设置“outfilename=u:\outfile.txt”
删除“%outfilename%”>NUL 2>NUL
呼叫:表格“文件夹”11“子”9文件8
对于/D%%G in(“*”)DO(
PUSHD“%%G”
对于/F“delims=“%%H in('dir/a:d/b*2^>num^ find/C/V”“)DO(
对于/F“delims=“%%I in('dir/a-d/b*2^>num^ find/C/V”“)DO(
调用:表单::12“%%H”6“%%I”9
)
)
流行音乐
)
后藤:EOF
:表格
对于(“%cd%”)中的%%z,请设置“$1=%%~nxz%sp12%”
如果“%~1”neq::“设置“$1=%~1%sp12%”
设置“$2=%sp12%%~3”
如果“%$5”==“0”(设置“$3=”)否则设置“$3=%sp12%%~5”
SETLOCAL ENABLEDELAYEDEXPANSION
如果定义为$3(
回音(!$1:~0,%2!!$2:~-%4!!$3:~-%6!>>%OutfielName%
)否则(
ECHO(!$1:~0,%2!!$2:~-%4!>>%OutfielName%
)
端部
后藤:eof

重定向到您的文件只是thisbatch>yourfilename

首先处理主体,唯一的更改是确保最里面的
for
位于中间
for
的上下文中,以便在格式化过程
:form
调用
时,所有
%%x
都在范围内

:form
过程将
$1
设置为当前目录的名称和扩展名,并附加12个空格。两个计数字段需要右对齐,因此将其值附加到
$2
$3
中的12个空格中

对于第三列为抑制零的特殊情况,清除
$3
,然后在
setlocal enabledelayedexpansion/endlocal
括号内克服有毒字符问题,使用
$3
作为开关生成1或2列。每列都是前n个或最后n个字符,
n
作为参数输入的

参数1中的特殊值
::
表示第1列中所需的显示为directoryname。如果提供的参数不是
::
,则使用适当填充并删除引号的参数。这允许生成标题

有趣的练习



修改-包括将
outfilename
设置到我的系统上方便的位置,并应用适当的重定向器。

命令
dir
在底部返回的摘要行中提供您需要的信息:

目录“D:\Data” 驱动器D中的卷没有标签。 卷序列号为0000-0000 D:\Data目录 2017/03/13 02:00 . 2017/03/13 02:00 .. 0个文件0个字节 2个目录1'073'741'824字节可用
这可用于实现您的目标:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
>“count.txt”(
回显文件夹#子#文件
回音/
对于/D%%G in(“*”)do(
设置“CURRDIR=%%~G”&设置/A“NUMDIRS=0,NUMFILE=0”
setlocal EnableDelayedExpansion
对于/F%%H in('dir/A/W“!CURRDIR!”2^>nul'),请执行以下操作(
设置/A“NUMFILE=NUMDIRS+2,NUMDIRS=%%H-2”
)
echo(!CURRDIR!!NUMDIRS!!NUMFILE!
端部
)
)
端部
退出/B

我想我应该使用
RoboCopy添加一种替代方法,我相信这可能会很快:

@(Echo(“FolderNames”、“Subs”、“Files”)
对于(*)中的/D%%A,如果不是“%%A”==”(SetLocal EnableDelayedExpansion),则执行@
对于/F“跳过=5个令牌=3”%%B In(
“RoboCopy/E/L/NFL/NDL/NJH”%%A“Null**”)如果未定义,则执行(
设置/A“\u s=%%B-1”)其他(如果未定义,则设置“\u f=%%B”)
回声(“%A”、“!\u s!”、“!\u f!”
EndLocal))>Counts.csv

…但这是未经测试的。

Thanx对于回复magoo,您的答案效果最好,但没有创建txt文件。如何添加txt文件?重定向到您的文件只是*thisbatch*>yourfilename。或者您可以在每个
echo
的末尾放置
>yourfilename,或者您可以放置一行仅包含
在/D%%G..
行及其匹配的
之前)
您的文件名在
第一个之前
goto:eof`the>>文件名在echo不起作用后,我得到一个空文件
echo(!$1:~0,%2!!$2:~-%4!!$3:~-%6!)>>count count.txt(echo(!$1:~0,%2!!$2:~-%4!)>count txt)我得到一个错误使用
SET“outfilename=u:\outfile.txt时,“系统找不到路径”"
但是当我使用例如D:\outfile.txt时,它会将文件保存到D,我如何从运行脚本的根文件夹中保存它?
%~dp0filename.txt
应该可以实现这一点-或者
\filename.txt
-尝试
回音
并观察您喜欢哪一个。您已经得到了四个答案s、 并已确认其中至少有两个有效。如果您选择首选解决方案并将其标记为正确,肯定会对本网站以及未来潜在的响应者和观众有所帮助。谢谢。您说得对。我只是在等待magoo看到我对将此输出到该公司的文件的评论