关于powershell:从Windows命令行获取文件夹大小 您所在的位置:网站首页 Windows命令行显示文件列表 关于powershell:从Windows命令行获取文件夹大小

关于powershell:从Windows命令行获取文件夹大小

2024-01-31 04:55| 来源: 网络整理| 查看: 265

在Windows中是否可以在不使用任何第三方工具的情况下从命令行获取文件夹的大小?

我希望获得与右键单击Windows资源管理器中的文件夹→"属性"时得到的结果相同的结果。

有一个内置的Windows工具:

1dir /s 'FolderName'

这将打印很多不必要的信息,但最后将是这样的文件夹大小:

12 Total Files Listed:        12468 File(s)    182,236,556 bytes

如果需要包括隐藏文件夹,请添加/a。

相关讨论 如果您不需要整数返回值,这是最优雅的解决方案。注意:" / a"开关将包括总大小中的隐藏文件和系统文件。 我想不可能以一些更有用的单位(例如kB或MB)打印文件大小,对吗? 用双引号代替单引号。

您可以递归地添加大小(以下是批处理文件):

1234@echo off set size=0 for /r %%x in (folder\\*) do set /a size+=%%~zx echo %size% Bytes

但是,这有几个问题,因为cmd限于32位带符号整数算术运算。因此,它将获得大于2 GiB的大小错误1。此外,它可能会多次计算符号链接和结点,因此充其量只是一个上限,而不是真正的大小(不过,使用任何工具都会遇到这个问题)。

一种替代方法是PowerShell:

1Get-ChildItem -Recurse | Measure-Object -Sum Length

或更短:

1ls -r | measure -sum Length

如果您想更漂亮:

123456789101112131415switch((ls -r|measure -sum Length).Sum) {   {$_ -gt 1GB} {     '{0:0.0} GiB' -f ($_/1GB)     break   }   {$_ -gt 1MB} {     '{0:0.0} MiB' -f ($_/1MB)     break   }   {$_ -gt 1KB} {     '{0:0.0} KiB' -f ($_/1KB)     break   }   default {"$_ bytes" } }

您可以直接在cmd:

中使用它

1powershell -noprofile -command"ls -r|measure -sum Length"

1我在批处理文件中确实有一个部分完成的bignum库,该库至少具有任意精度的整数加法。我应该释放它,我想:-)

相关讨论 1我只是在get-help *输出中徘徊,找到了类似的东西。 史蒂夫,在我看来,PowerShell比Unix更适合Unix,因为大多数核心命令实际上都是正交的。在Unix中,du给出目录大小,但是它要做的只是遍历树并进行总结。在这样的管道中可以非常优雅地表达一些东西:-)。因此,对于PowerShell,我通常会寻找如何将高级目标分解为合适的低级操作的方法。 它似乎不返回用户主目录的当前结果。在一种情况下,如果我右键单击主文件夹并获取属性,则会看到?200 MB。如果我做ls -r |测量-s长度,然后我看到6兆(以字节为单位) 我明白了,这似乎忽略了隐藏的文件夹。如果我也想包括隐藏文件夹,则ls -force -r可以工作。 作为参考,Sysinternals du(根据Steve的回答)非常聪明,不会迭代到连接点等,甚至可以正确处理硬链接。 folder\\*对我不起作用,我放置的文件夹的大小显示0字节,请问有什么解决办法吗? @ITresearcher我也得到0。我尝试了powershell -noprofile -command"ls -r|measure -s Length"并且工作正常 更好看的版本:powershell -noprofile -command"'{0:N0}'-f(ls -r | measure -s Length)。Sum" 有没有一种方法可以为文件夹添加命令行参数? @athos:是的,有。 @athos:在批处理文件中使用%1代替folder,或将参数添加到PowerShell脚本,并将其作为参数添加到Get-ChildItem。但是,如果您在该部分遇到问题,最好将这些问题作为一个单独的问题进行询问(因为它与此处的原始问题无关)。 仅对于那些可能进入的用户,以下是查询文件夹的方法:在powerscript中:Get-ChildItem -Path c:\\temp -Recurse | Measure-Object -Sum Length,在cmd中:powershell -noprofile -command"'{0:N0}' -f (ls c:\\temp -r|measure -s Length).Sum" 它将在没有访问权限的第一个目录上以错误退出。它应该跳过它,或者只给出警告。 我发现我遇到了非常深的文件结构错误,然后了解了Windows 260 char路径限制。更改注册表以允许长文件路径为我解决了这个问题。 howtogeek.com/266621/… @ITresearcher for命令的格式不正确,应为:for /r folder %%x in (*) do set /a size+=%%~zx

我建议在此链接下从Microsoft提供的Sysinternals Suite下载实用程序DU。 http://technet.microsoft.com/zh-cn/sysinternals/bb896651

12345678910111213141516171819usage: du [-c] [-l | -n | -v] [-u] [-q]    -c     Print output as CSV.    -l     Specify subdirectory depth of information (default is all levels).    -n     Do not recurse.    -q     Quiet (no banner).    -u     Count each instance of a hardlinked file.    -v     Show size (in KB) of intermediate directories. C:\\SysInternals>du -n d:\\temp Du v1.4 - report directory disk usage Copyright (C) 2005-2011 Mark Russinovich Sysinternals - www.sysinternals.com Files:        26 Directories:  14 Size:         28.873.005 bytes Size on disk: 29.024.256 bytes

在查看的同时,请查看其他实用程序。它们是每个Windows Professional的救生员

相关讨论 我猜这几乎"没有任何第三方工具"。 哦,对,但它认为不应将家庭视为"第三方"。 好吧,当然,但这仍然是一个额外的下载(如果仍然存在,请使用\\\\live.sysinternals.com)。我完全同意,默认情况下应包括所有sysinternals工具。尽管对于许多用途而言,PowerShell是非常值得的替代品。 有人说过Powershell吗?尝试以下操作:" {0:N2}" -f((Get-ChildItem C:\\\\ Temp -Recurse | Measure-Object -Property Length -Sum).Sum / 1MB)" MB" 我建议大家下载Mark Russinovich开发的所有软件:)每当我找到可以挽救生命的工具时,我都会不断看到这个名字。 此实用程序(v1.61)出现权限问题,导致某些文件的大小未包括在内。除非使用管理员提升的控制台,否则这会使该工具有些不可靠。注意:使用dir命令列出文件和大小。 (我曾认为这可能是文件大小的问题,因为问题目录包含数据库文件,其中许多文件大于2GB。)

单线:

1powershell -command"$fso = new-object -com Scripting.FileSystemObject; gci -Directory | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName | sort Size -Descending | ft @{l='Size [MB]'; e={'{0:N2}    ' -f ($_.Size / 1MB)}},FullName"

相同但仅适用于Powershell:

12345$fso = new-object -com Scripting.FileSystemObject gci -Directory `   | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName `   | sort Size -Descending `   | ft @{l='Size [MB]'; e={'{0:N2}    ' -f ($_.Size / 1MB)}},FullName

这将产生以下结果:

12345678910111213141516Size [MB]  FullName ---------  -------- 580,08     C:\\my\\Tools\\mongo 434,65     C:\\my\\Tools\\Cmder 421,64     C:\\my\\Tools\\mingw64 247,10     C:\\my\\Tools\\dotnet-rc4 218,12     C:\\my\\Tools\ esharperCLT 200,44     C:\\my\\Tools\\git 156,07     C:\\my\\Tools\\dotnet 140,67     C:\\my\\Tools\\vscode 97,33      C:\\my\\Tools\\apache-jmeter-3.1 54,39      C:\\my\\Tools\\mongoadmin 47,89      C:\\my\\Tools\\Python27 35,22      C:\\my\\Tools\ obomongo 相关讨论 有没有办法在基本文件夹中显示所有文件和Mb大小?在这种情况下,`C:\\\\ my \\\\ Tools` 另外,当有很多文件夹时(例如在C:驱动器中),它会中断 0.00 C:\\Windows我可以为所有文件夹优化此设置吗,尝试已经以admin身份运行 这很好,但是它会截断我的组件文件夹名称。完整显示它们的命令是什么? @ sean.net您是说如果文件夹很长,它以" ..."结尾吗?这就是ft(Format-Table)的工作方式。您可以尝试使用fl代替(Format-List) 太好了,为我工作!

如果您的计算机中已安装git(越来越常见),只需打开MINGW32并键入:du folder

相关讨论 如果需要人类可读的大小,仅一层子目录并按大小排序,则可以使用以下命令du -h -d 1 folder | sort -h。

我建议使用我编写的https://github.com/aleksaan/diskusage实用程序。非常简单,乐于助人。而且非常快。

只需在命令外壳中键入

1diskusage.exe -path 'd:/go; d:/Books'

并获取按大小排列的文件夹列表

12  1.| DIR: d:/go      | SIZE: 325.72 Mb   | DEPTH: 1   2.| DIR: d:/Books   | SIZE:  14.01 Mb   | DEPTH: 1

此示例在HDD上以272ms执行。

您可以增加子文件夹的深度进行分析,例如:

1diskusage.exe -path 'd:/go; d:/Books' -depth 2

不仅获取所选文件夹的大小,还获取其子文件夹的大小

1234567891011  1.| DIR: d:/go            | SIZE: 325.72 Mb   | DEPTH: 1   2.| DIR: d:/go/pkg        | SIZE: 212.88 Mb   | DEPTH: 2   3.| DIR: d:/go/src        | SIZE:  62.57 Mb   | DEPTH: 2   4.| DIR: d:/go/bin        | SIZE:  30.44 Mb   | DEPTH: 2   5.| DIR: d:/Books/Chess   | SIZE:  14.01 Mb   | DEPTH: 2   6.| DIR: d:/Books         | SIZE:  14.01 Mb   | DEPTH: 1   7.| DIR: d:/go/api        | SIZE:   6.41 Mb   | DEPTH: 2   8.| DIR: d:/go/test       | SIZE:   5.11 Mb   | DEPTH: 2   9.| DIR: d:/go/doc        | SIZE:   4.00 Mb   | DEPTH: 2  10.| DIR: d:/go/misc       | SIZE:   3.82 Mb   | DEPTH: 2  11.| DIR: d:/go/lib        | SIZE: 358.25 Kb   | DEPTH: 2

***已对服务器上的3.5Tb进行3毫秒12s扫描**

相关讨论 新版本发布! github.com/aleksaan/diskusage改进:1)使用symlink的大小正确工作2)或有关分析对象的所有信息 版本2.0.2已发布! github.com/aleksaan/diskusage/releases/tag/v2.0.2-配置文件而不是内联参数-简单的使用模式(将diskusage可执行文件复制到任何文件夹,运行它并获取结果)-正确的结果输出(正确的行号赢) / unix)-将结果保存到文件或以控制台方式获取(选项" tofile") 请注意您是作者。 (来自stackoverflow.com/help/promotion:"但是,您必须在回答中公开您的隶属关系。") 是的,我是github.com/aleksaan/diskusage程序的作者 版本2.1.0已发布。 github.com/aleksaan/diskusage/releases/tag/v2.1.0-内存消耗优化-减少分析时间-错误修复 版本2.2.0已发布.github.com / aleksaan / diskusage / releases / tag / v2.2.0-现在快5倍!

这是我编写的Powershell代码,用于列出当前目录下所有文件夹的列表大小和文件计数。可以根据需要随意重用或修改。

12345678$FolderList = Get-ChildItem -Directory foreach ($folder in $FolderList) {     set-location $folder.FullName     $size = Get-ChildItem -Recurse | Measure-Object -Sum Length     $info = $folder.FullName +"    FileCount:" + $size.Count.ToString() +"   Size:" + [math]::Round(($size.Sum / 1GB),4).ToString() +" GB"     write-host $info } 相关讨论 为我工作。如果您在无头服务器上,则很有用。 简洁大方!我的版本:$FolderList = Get-ChildItem -Directory -Force; $data = foreach ($folder in $FolderList) { set-location $folder.FullName; $size = Get-ChildItem -Recurse -Force | Measure-Object -Sum Length; $size | select @{n="Path"; e={$folder.Fullname}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} }这将提供对象(更多Powershell风格的对象)," FileCount"和" Size"是整数(因此,以后可以根据需要对其进行处理),并且" Size"以字节为单位,但是您可以轻松地实现用$Data.Size / 1GB将其转换为GB(或所需的单位)。 或单线:$Data = dir -Directory -Force | %{ $CurrentPath = $_.FullName; Get-ChildItem $CurrentPath -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Sum Length | select @{n="Path"; e={$CurrentPath}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} } 我最喜欢这一个,但是set-location不是不必要的吗?您可以直接进入Get-ChildItem $folder.FullName,这样就可以在不更改当前目录的情况下从另一端出来。 谢谢@BenderBoy。最好删除set-location并直接使用Get-ChildItem $folder.FullName。

我猜想这只有在目录是相当静态的并且目录的内容在两个dir命令的执行之间没有变化的情况下才有效。也许可以通过一种方法将其组合为一个命令来避免这种情况,但这对我来说是可行的(我不想要完整的清单;仅是摘要)。

GetDirSummary.bat脚本:

1234567@echo off rem  get total number of lines from dir output FOR /F"delims=" %%i IN ('dir /S %1 ^| find"asdfasdfasdf" /C /V') DO set lineCount=%%i rem  dir summary is always last 3 lines; calculate starting line of summary info set /a summaryStart="lineCount-3" rem  now output just the last 3 lines dir /S %1 | more +%summaryStart%

用法:

GetDirSummary.bat c:\\\\ temp

输出:

123 Total Files Listed:           22 File(s)         63,600 bytes            8 Dir(s)  104,350,330,880 bytes free

此代码已通过测试。您可以再次检查。

1234567891011121314@ECHO OFF CLS SETLOCAL ::Get a number of lines contain"File(s)" to a mytmp file in TEMP location. DIR /S /-C | FIND"bytes" | FIND /V"free" | FIND /C"File(s)">%TEMP%\\mytmp SET /P nline=%TEMP%\\mytmp1 SET /P mainline=>Folder_FileCountandSize.txt ) pause

为了能够方便地使用此批处理文件,请将其放在您的SendTo文件夹中。 这将允许您右键单击一个文件夹或文件夹的选择,单击SendTo选项,然后选择此批处理文件。

要在计算机上找到SendTo文件夹,最简单的方法是打开cmd,然后按原样复制此行。

12explorer C:\\Users\\%username%\\AppData\ oaming\\Microsoft\\Windows\\SendTo 相关讨论 对于任何担心Robocopy会移动文件的人。 / l选项仅列出。此外,Robocopy不是第三方,Robocopy是默认从Windows Vista开始安装在Windows中的,需要安装XP。 感谢您的添加。很高兴看到此线程仍然吸引注意;-)可能想添加如何安装robocopy(强大的工具!)。

尝试:

12SET FOLDERSIZE=0 FOR /F"tokens=3" %A IN ('DIR"C:\\Program Files" /a /-c /s ^| FINDSTR /C:" bytes" ^| FINDSTR /V /C:" bytes free"') DO SET FOLDERSIZE=%A

将C:\\\\ Program Files更改为所需的任何文件夹,如果在批处理文件中使用,则将%A更改为%% A

它返回整个文件夹的大小,包括子文件夹,隐藏文件和系统文件,并且可用于2GB以上的文件夹。

它确实会写入屏幕,因此如果您不想使用临时文件,则必须使用它。

以下脚本可用于获取和累积给定文件夹下每个文件的大小。 文件夹路径%folder%可以作为此脚本的参数(%1)。 最终,结果保存在参数%filesize%

123456789101112@echo off SET count=1 SET foldersize=0 FOR /f"tokens=*" %%F IN ('dir /s/b %folder%') DO (call :calcAccSize"%%F") echo %filesize% GOTO :eof :calcAccSize  REM echo %count%:%1  REM set /a count+=1  set /a foldersize+=%~z1  GOTO :eof

注意:方法calcAccSize也可以打印文件夹的内容(在上面的示例中进行了注释)

我解决了类似的问题。此页面中的某些方法很慢,而在多语言环境中则有些问题(均假设为英语)。 我发现在cmd中使用vbscript的简单解决方法。已在W2012R2和W7中进行了测试。

12>%TEMP%\\_SFSTMP$.VBS ECHO/Set objFSO = CreateObject("Scripting.FileSystemObject"):Set objFolder = objFSO.GetFolder(%1):WScript.Echo objFolder.Size FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\\_SFSTMP$.VBS') DO (SET"S_=%%?"&&(DEL %TEMP%\\_SFSTMP$.VBS))

设置环境变量S_。当然,您可以更改最后一行以将结果直接显示为例如

1FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\\_SFSTMP$.VBS') DO (ECHO"Size of %1 is %%?"&&(DEL %TEMP%\\_SFSTMP$.VBS))

您可以将其用作子例程或独立的cmd。参数是用引号关闭的已测试文件夹的名称。

获得总大小的最简单方法是powershell,但仍然受到这样的事实的限制,即总长度中不包含超过260个字符的路径名

相关讨论 这是一个不好的回答。什么是命令行或代码?



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有