Windows命令提示符:如何获取当前目录中所有文件的计数?


24

您将使用什么命令cmd.exe来查找当前目录中的文件数?

这里有一个powershell选项吗?

更新:我希望避免出现这种情况dir,因为我知道当前目录中有10,000多个文件。希望避免将枚举输出到cmd窗口。谢谢!

Answers:


27

如果要使用进行操作cmd,则以下是简单的方法:

set count=0 & for %x in (*) do @(set /a count+=1 >nul)
echo %count%

那是假设命令行。在批处理文件中,您将执行

@echo off
setlocal enableextensions
set count=0
for %%x in (*) do set /a count+=1
echo %count%
endlocal

这会使事情变得更好。您可以>nul批量添加,因为set /a如果从批处理文件运行将不会显示结果,而是直接从命令行执行。此外,循环中的%符号for必须加倍。

我已经看到很多人尝试使用技巧的漂亮例子find /c非常小心的,因为各种事情可以打破这一点。

常见错误:

  1. 使用find /c /v并尝试查找文件名中永远不会包含的内容::。惯于。工作。可靠地。当控制台窗口设置为光栅字体时,您可以获取那些字符组合。我可以包括在文件名中的字符,如:?等在他们的例如全宽变体,那么这将被转换到正常的ASCII同行这将打破这一点。如果您需要准确的计数,请不要尝试此操作。

  2. 使用find /c并尝试查找文件名中始终包含的内容。显然,点(.)是一个糟糕的选择。另一个答案表明

    dir /a-d | find /c ":"

    它假定了有关用户区域设置的几件事,但并非所有事情都保证是正确的(我在此处留下了详细说明问题的注释),并且返回的结果太多。

通常,您希望finddir /b其中使用来切掉所有非文件名的内容,并避免这种方式的篱笆错误。

因此,优雅的变体是:

dir /b /a-d | find /c /v ""

这将首先输出所有文件名,每个文件名一行。然后计算该输出的所有非空行。由于文件名不能为空(除非我遗漏了一些东西,但是根据我的测试,Unicode不会将其绊倒)。


1
+1正是我想要的。谢谢JR!
p.campbell

进行细微调整以使第一个版本全部变为一行:(设置计数= 0并为(*)中的%x做@(设置/ a计数+ = 1> nul))&&回声%count%
Jason Massey

+1 fordir /b /a-d | find /c /v ""
Arvo Bowen'9

当有数百万个文件时,此解决方案不能很好地工作。它“永远”运行-更好的解决方案在下面发布,使用PS和[System.IO.Directory] ​​:: GetFiles($ path).Count
ripvlan

@jason,由于%count%在解析时已扩展,因此可能会失败。
乔伊(Joey)

17

问与答将收到:http : //technet.microsoft.com/en-us/library/ee692796.aspx

计算文件夹中的项目数

好吧,您知道什么:看起来太阳终于要出来了,这意味着我们差不多该走了。但是,在开始之前,让我们向您展示Get-ChildItem cmdlet的最后一个小技巧。有时,您实际上并不需要太多了解文件夹中的文件。您真正需要知道的是在特定文件夹中可以找到多少个文件(如果有)。您可以通过以下方法快速计算文件夹中的文件数:

(Get-ChildItem C:\Scripts).Count

我们在这里做什么?我们只是使用Get-ChildItem返回在文件夹C:\ Scripts中找到的所有项目的集合。因为这是一个集合,所以我们要做的就是回显Count属性的值,该值告诉我们集合中的项目数。请注意括号的使用:我们将Get-ChildItem命令括在括号中,以确保Windows PowerShell首先获取该集合,然后才回显该集合的Count属性的值。

并且可以肯定的是,在调用Get-ChildItem时可以包含一个过滤器。需要知道文件夹C:\ Scripts中有多少个.PS1文件?奥基杜克:

(Get-ChildItem C:\Scripts -filter "*.ps1").Count

仅供参考..我用谷歌搜索“ powershell计数文件”。


1
根据第二个示例,您需要添加一个文件规范以使计数实际计数文件
Jim B 2010年

3
只是为了清楚起见(Get-ChildItem C:\ Scripts)。Count不会返回文件夹中的文件数,它将返回文件夹中的OBJECTS数。您必须添加过滤器或文件规范才能使它计数文件。从您的C:驱动器的根目录尝试(gci).count和dir并查看数字的差异
Jim B 2010年

4
从同一链接,如果您也想在子文件夹中计算文件,请使用:(Get-ChildItem -recurse -filter "*.ps1").Count
jrsconfitto 2012年

1
如果只有一个文件,则不起作用,必须执行以下操作:$ filecount = @(get-childitem $ directory -filter“ ”).Count。根据我在其他地方阅读的内容,如果有一个文件,它就不是数组。
NealWalters

@NealWalters:在PowerShell v3之前,这是正确的。从那以后没关系。
乔伊

8
dir /a-d | find "File(s)"

关于使用PowerShell执行类似这样的简单文件操作的警告-与cmd.exe相比,它的运行速度非常慢,尤其是在网络连接或目录中有成千上万个文件的情况下。有关更多信息,请参见此论坛帖子


如果您的系统使用的语言与英语不同,那么您将遇到问题。
WalyKu

7

dir 在底部提供了文件总数。


1
1个队友,您击败了我:)
dyasny 2010年

2
并且避免了观看所有行在cmd窗口中滚动的代价……将其最小化,可以更快地工作。
gbjbaanb 2010年

1
或者只是dir > file..啊,我想念POSIX
lorenzog 2010年

1
@lorenz:为什么dir > file不能在Windows中工作?您知道,输出重定向并非完全是魔术。
乔伊

1
@johannes:确实有效!我很想念POSIX,因为您可以“ dir | grep (something)避免”做为避免缓慢的屏幕写操作,这种写操作会使事情变慢(并将其最小化)。
lorenzog 2010年

7

我发现最快的方法是在PS控制台中运行以下命令。

[System.IO.Directory]::GetFiles($path).Count

其中$ path是本地路径或UNC共享。


2
看那个。在提出问题后将近7.5年,一个有效的真棒答案出现了!
p。坎贝尔'17

在包含超过210万个文件的目录中的虚拟服务器上工作,对我来说,返回计数大约需要10秒。当然,这应该是正确的答案。
DarrenMB

这确实是最好的答案。我有一个包含450万个文件的文件夹,这种方法在几秒钟内便对它们进行计数。在我放弃之前,其他建议答案中的方法运行了几分钟。
ripvlan '18

3

只计算dir / B输出(包括目录)中的行:
dir /B | find /c /v "~~~"

仅计数文件(无目录):
dir /A-D /B | find /c /v "~~~"


这将返回文件和目录数作为一个整体
TheCleaner

2

在网上找到了这个

dir /a-d | find /c ":" > NUMfiles.###
set /p count=<NUMfiles.###
echo %count%

我进行了测试,它似乎可以正常工作。


“似乎”在这里是正确的词。(1)在任何情况下,此dir命令都将关闭,因为该命令在其中包含带有冒号的行,而不是文件。(2)这依赖于时间格式来包含冒号,而不必一定要这样。(3)它依赖于包含冒号的数字格式,也不必一定要这样。此外,在这里浏览文件是不必要的,如果您没有写访问权,则是行不通的-不好的主意。
乔伊,2010年

如何在不创建文件“ NUMfiles。###”的情况下进行制作?
NickUnuchek 2015年

2

对于那些可能使用上面Trevoke的PowerShell答案的警告(Windows命令提示符:如何获取当前目录中所有文件的计数?):通过设计,回显Get-ChildItem返回的集合的Count属性会产生误导性的结果如果值为1或0,这是因为Count属性仅在数组上可用。如果Get-ChildItem返回的项目少于2个,则结果为标量,.Count不返回任何内容。要解决此问题,请将其显式转换为数组,例如@(Get-ChildItem C:\ Scripts).Count。

有关更多信息,请参见http://connect.microsoft.com/PowerShell/feedback/details/354672/get-childitem-count-problem-with-one-filehttp://www.vistax64.com/powershell/266379 -get-childitem-count-not-working-one-file.html



0

导演当然会工作

无需在服务器上安装任何东西,但在工作站上安装Powershell,您可以执行以下操作:

(gwmi -computer theserver -query "select *from cim_datafile where path = '\\'").count

该命令将为您提供所有文件(包括系统文件和隐藏文件),并且如前所述,如果在计算机上安装了Powershell,则只需

(GCI c:\*.*).count

请注意,如果您不包括您将获得所有文件和所有目录的计数。您将不包括需要添加-force来计算全部数量的隐藏文件和系统文件


0

如果仅在使用dir后才需要此功能,否则我会考虑自己滚动(可能是C#应用程序),因为这是我最熟悉的(尽管VBScript或PowerShell也将是可行的)。

(顺便说一句-如果您使用的是cmd.exe,则不是DOS)


0

我相信您可以使用attrib来获取文件数:

attrib.exe /s /D *.*|find /c /v "" >> filecount.txt

这将在当前目录中创建一个名为filecount.txt的文件,其中包含当前目录中文件和文件夹的数量(包括新创建的文件)。您可以更改

*.*

<full_path>\*.*

为了获得特定目录的文件数。如果不想计数文件夹,请删除“ / D”选项。“ / s”选项处理指定路径中所有目录中的文件。因此,如果只希望文件位于指定的路径中,而又不想在子文件夹中包含文件,则将其删除。

因此,例如,如果您想找出C:\驱动器中有多少个文件,而不是任何子文件夹,则可以使用以下命令:

attrib.exe C:\*.* | find /c /v "" >> filecount.txt

使用文件获取结果不是最明智的想法。如果当前目录不可写怎么办?
乔伊

@Johannes使用您具有写访问权限的目录?例如,将输出通过管道传递到C:\ MyWritableDir \ filecount.txt
冒烟2010年

仍然没有必要。
乔伊

-2

我正在做类似的事情,并且可以立即处理任意数量的文件。

Setlocal enabledelayedexpansion

Dir /A | find "File(s)" >tmp

For /F "tokens=1" %%i in (tmp) do set n=%%i

Del tmp

If !n! GEQ 10 echo Too many files in directory.

为什么要对已经存在很多(好的)答案的6年问题发表无用的(有缺陷的)答案?
马西莫

@Massimo,因为我对上面的答案不满意,并想要一个更优雅的解决方案。为什么会阻碍追求不受时间限制的知识?
亚伦·劳

啊!这些答复看起来很可怕。将解决方案编辑成答案。无需感谢我,我爱帮助他人的负面代表:-P
Aaron Lowe

确实没有理由使用临时文件来保存一些输出。同样,使用find也不是一个好主意。有关详细信息,请参见接受的答案。
Massimo'Mar

@Massimo我回答了你的问题。你欠我一个答案。如果可以向我展示如何避免使用临时文件,我将不胜感激。我已经阅读了所有答案,这就是为什么我发布了自己的答案。您假设由于接受了答案,所以找不到新答案。这不仅适用于OP,而且适用于所有寻求相同解决方案的人。
亚伦·劳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.