É possível no Windows obter o tamanho de uma pasta na linha de comando sem usar nenhuma ferramenta de terceiros?
Eu quero o mesmo resultado que você obteria ao clicar com o botão direito do mouse na pasta nas propriedades do Windows Explorer →.
É possível no Windows obter o tamanho de uma pasta na linha de comando sem usar nenhuma ferramenta de terceiros?
Eu quero o mesmo resultado que você obteria ao clicar com o botão direito do mouse na pasta nas propriedades do Windows Explorer →.
Respostas:
Você pode adicionar tamanhos de forma recursiva (a seguir, um arquivo em lotes):
@echo off
set size=0
for /r %%x in (folder\*) do set /a size+=%%~zx
echo %size% Bytes
No entanto, isso tem vários problemas porque cmd
é limitado à aritmética de número inteiro assinado de 32 bits. Portanto, obterá tamanhos acima de 2 GiB incorretos 1 . Além disso, provavelmente contará links simbólicos e junções várias vezes, portanto, na melhor das hipóteses, é um limite superior, não o tamanho real (você terá esse problema com qualquer ferramenta).
Uma alternativa é o PowerShell:
Get-ChildItem -Recurse | Measure-Object -Sum Length
ou mais curto:
ls -r | measure -sum Length
Se você quiser mais bonito:
switch((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" }
}
Você pode usar isso diretamente em cmd
:
powershell -noprofile -command "ls -r|measure -sum Length"
1 Eu tenho uma biblioteca bignum parcialmente finalizada em arquivos em lote em algum lugar que, pelo menos, acerta a adição inteira de precisão arbitrária. Eu realmente deveria liberá-lo, eu acho :-)
du
fornece o tamanho do diretório, mas tudo o que está fazendo é andar na árvore e resumir. Algo que pode ser muito elegantemente expresso em um pipeline como aqui :-). Portanto, para o PowerShell, costumo procurar como decompor a meta de alto nível em operações adequadas de nível inferior.
folder\*
não está funcionando para mim o tamanho da pasta que eu coloquei no local mostra 0 bytes, existe alguma solução?
Há uma ferramenta interna do Windows para isso:
dir /s 'FolderName'
Isso imprimirá muitas informações desnecessárias, mas o final será o tamanho da pasta assim:
Total Files Listed:
12468 File(s) 182,236,556 bytes
Se você precisar incluir pastas ocultas, adicione /a
.
Sugiro baixar o utilitário DU do Sysinternals Suite, fornecido pela Microsoft neste link http://technet.microsoft.com/en-us/sysinternals/bb896651
usage: du [-c] [-l <levels> | -n | -v] [-u] [-q] <directory>
-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
Enquanto você está nisso, dê uma olhada nos outros utilitários. Eles economizam a vida de todos os profissionais do Windows
\\live.sysinternals.com
se ainda existir). No entanto, concordo plenamente que todas as ferramentas sysinternals devem ser incluídas por padrão. Embora para muitos usos, o PowerShell seja um substituto bastante digno.
Oneliner:
powershell -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"
O mesmo, mas apenas o PowerShell:
$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
Isso deve produzir o seguinte resultado:
Size [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\ResharperCLT
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\robomongo
0.00 C:\Windows
I pode otimizar isso para todas as pastas, já tentou correr como admin
ft
( Format-Table
) funciona. Você pode tentar fl
em vez disso ( Format-List
)
Se você tem o git instalado no seu computador (ficando cada vez mais comum), basta abrir o MINGW32 e digite: du folder
du -h -d 1 folder | sort -h
se desejar tamanho legível por humanos, apenas um nível de subdiretórios e classificar por tamanho.
Eu recomendo usar o https://github.com/aleksaan/diskusage . Muito simples e útil. E muito rápido.
Basta digitar um shell de comando
diskusage.exe -path 'd:/go; d:/Books'
e obtenha uma lista de pastas organizadas por tamanho
1. DIR: d: / go | TAMANHO: 325.72 Mb | PROFUNDIDADE: 1 2. DIR: d: / Livros | TAMANHO: 14.01 Mb | PROFUNDIDADE: 1
Este exemplo foi executado em 272ms no HDD.
Você pode aumentar a profundidade das subpastas para analisar, por exemplo:
diskusage.exe -path 'd:/go; d:/Books' -depth 2
e obtenha tamanhos não apenas para as pastas selecionadas, mas também para suas subpastas
1. DIR: d: / go | TAMANHO: 325.72 Mb | PROFUNDIDADE: 1 2. DIR: d: / go / pkg | TAMANHO: 212,88 Mb | PROFUNDIDADE: 2 3. DIR: d: / go / src | TAMANHO: 62.57 Mb | PROFUNDIDADE: 2 4. | DIR: d: / go / bin | TAMANHO: 30.44 Mb | PROFUNDIDADE: 2 5. DIR: d: / Livros / Xadrez | TAMANHO: 14.01 Mb | PROFUNDIDADE: 2 6. DIR: d: / Livros | TAMANHO: 14.01 Mb | PROFUNDIDADE: 1 7. DIR: d: / go / api | TAMANHO: 6.41 Mb | PROFUNDIDADE: 2 8. DIR: d: / go / teste | TAMANHO: 5.11 Mb | PROFUNDIDADE: 2 9. DIR: d: / go / doc | TAMANHO: 4,00 Mb | PROFUNDIDADE: 2 10. | DIR: d: / go / variado | TAMANHO: 3,82 Mb | PROFUNDIDADE: 2 11. DIR: d: / go / lib | TAMANHO: 358.25 Kb | PROFUNDIDADE: 2
* 3.5Tb no servidor foi verificado por 3m12s
Aí vem um código do PowerShell que escrevo para listar o tamanho e a contagem de arquivos de todas as pastas no diretório atual. Sinta-se livre para reutilizar ou modificar de acordo com sua necessidade.
$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}} }
isso fornecerá objetos (mais Powershell-ish), 'FileCount' e 'Size' são números inteiros (para que você possa processá-los mais tarde, se necessário), e 'Size' está em bytes, mas você pode convertê-lo facilmente em GB (ou a unidade que você deseja) com $Data.Size / 1GB
.
$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}} }
Este código é testado. Você pode verificar novamente.
@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%\mytmp
SET nline=[%nline%]
::-------------------------------------
DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /N "File(s)" | FIND "%nline%" >%TEMP%\mytmp1
SET /P mainline=<%TEMP%\mytmp1
CALL SET size=%mainline:~29,15%
ECHO %size%
ENDLOCAL
PAUSE
Eu acho que isso só funcionaria se o diretório fosse bastante estático e seu conteúdo não fosse alterado entre a execução dos dois comandos dir. Talvez uma maneira de combinar isso em um comando para evitar isso, mas funcionou para o meu propósito (eu não queria a lista completa; apenas o resumo).
Script GetDirSummary.bat:
@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%
Uso:
GetDirSummary.bat c: \ temp
Resultado:
Total Files Listed:
22 File(s) 63,600 bytes
8 Dir(s) 104,350,330,880 bytes free
Eu recebi du.exe
minha distribuição git. Outro local pode ser o Microsoft ou Unxutils acima mencionados .
Depois de obter o du.exe no seu caminho. Aqui está o seu fileSizes.bat
:-)
@echo ___________
@echo DIRECTORIES
@for /D %%i in (*) do @CALL du.exe -hs "%%i"
@echo _____
@echo FILES
@for %%i in (*) do @CALL du.exe -hs "%%i"
@echo _____
@echo TOTAL
@du.exe -sh "%CD%"
➪
___________
DIRECTORIES
37M Alps-images
12M testfolder
_____
FILES
765K Dobbiaco.jpg
1.0K testfile.txt
_____
TOTAL
58M D:\pictures\sample
Eu acho que sua única opção será diruse (uma solução de terceiros altamente suportada):
Obter tamanho do arquivo / diretório na linha de comando
A CLI do Windows é infelizmente bastante restritiva, você pode instalar o Cygwin como alternativa que é um sonho para ser usado em comparação com o cmd. Isso daria acesso à ferramenta Unix portada, que é a base do diruse no Windows.
Desculpe, não foi possível responder suas perguntas diretamente com um comando que você pode executar no CLI nativo.
:: Obtenha um número de linhas que os comandos Dir retornam (/ -c para eliminar os separadores de números:.,) ["Tokens = 3" para examinar apenas a terceira coluna de cada linha em Dir]
FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO set /a i=!i!+1
Número da penúltima linha, onde é o número de bytes da soma dos arquivos:
set /a line=%i%-1
Finalmente, obtenha o número de bytes na penúltima linha - terceira coluna:
set i=0
FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO (
set /a i=!i!+1
set bytes=%%a
If !i!==%line% goto :size
)
:size
echo %bytes%
Como não usa a pesquisa por palavras, não haveria problemas de idioma.
Limitações:
Experimentar:
SET 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
Altere C: \ Arquivos de programas para a pasta desejada e altere% A para %% A se estiver usando em um arquivo em lotes
Ele retorna o tamanho de toda a pasta, incluindo subpastas e arquivos ocultos e do sistema, e funciona com pastas com mais de 2 GB
Ele grava na tela, então você terá que usar um arquivo provisório se não quiser.
O script a seguir pode ser usado para buscar e acumular o tamanho de cada arquivo em uma determinada pasta.
O caminho da pasta %folder%
pode ser fornecido como argumento para este script ( %1
).
Por fim, os resultados são mantidos no parâmetro%filesize%
@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
Nota: O método calcAccSize
também pode imprimir o conteúdo da pasta (comentado no exemplo acima)
Então, aqui está uma solução para os seus pedidos da maneira que você solicitou originalmente. Isso dará ao usuário legibilidade do tamanho do arquivo, sem os limites de tamanho que todos estão enfrentando. Compatível com Win Vista ou mais recente. XP disponível apenas se o Robocopy estiver instalado. Basta soltar uma pasta nesse arquivo em lotes ou usar o melhor método mencionado abaixo.
@echo off
setlocal enabledelayedexpansion
set "vSearch=Files :"
For %%i in (%*) do (
set "vSearch=Files :"
For /l %%M in (1,1,2) do (
for /f "usebackq tokens=3,4 delims= " %%A in (`Robocopy "%%i" "%%i" /E /L /NP /NDL /NFL ^| find "!vSearch!"`) do (
if /i "%%M"=="1" (
set "filecount=%%A"
set "vSearch=Bytes :"
) else (
set "foldersize=%%A%%B"
)
)
)
echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!
REM remove the word "REM" from line below to output to txt file
REM echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!>>Folder_FileCountandSize.txt
)
pause
Para poder usar esse arquivo em lotes, coloque-o convenientemente na pasta SendTo. Isso permitirá que você clique com o botão direito do mouse em uma pasta ou em uma seleção de pastas, clique na opção SendTo e selecione esse arquivo em lotes.
Para encontrar a pasta SendTo no seu computador, a maneira mais simples é abrir o cmd e copiar nesta linha como está.
explorer C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo
Eu resolvi um problema semelhante. Alguns dos métodos desta página são lentos e outros são problemáticos em um ambiente multilíngue (todos supõem inglês). Eu encontrei uma solução simples usando vbscript no cmd. É testado em W2012R2 e W7.
>%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))
Ele configurou a variável de ambiente S_. Obviamente, você pode alterar a última linha para exibir diretamente o resultado para, por exemplo,
FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (ECHO "Size of %1 is %%?"&&(DEL %TEMP%\_SFSTMP$.VBS))
Você pode usá-lo como sub-rotina ou como cmd independente. Parâmetro é o nome da pasta testada fechada entre aspas.
O método mais fácil de obter apenas o tamanho total é o PowerShell, mas ainda é limitado pelo fato de os nomes de caminhos com mais de 260 caracteres não serem incluídos no total.