जवाबों:
आप केवल पुनरावर्ती आकार जोड़ सकते हैं (निम्नलिखित एक बैच फ़ाइल है):
@echo off
set size=0
for /r %%x in (folder\*) do set /a size+=%%~zx
echo %size% Bytes
हालाँकि, इसमें कई समस्याएं हैं क्योंकि cmd
32-बिट हस्ताक्षरित पूर्णांक अंकगणित तक सीमित है। तो यह 2 GiB गलत 1 के ऊपर आकार प्राप्त करेगा । इसके अलावा यह संभवत: सहजीवन और जंक्शनों को कई बार गिनाएगा ताकि यह सबसे अच्छा ऊपरी सीमा पर हो, न कि सही आकार (आपको किसी भी उपकरण के साथ यह समस्या होगी, हालांकि)।
एक विकल्प है PowerShell:
Get-ChildItem -Recurse | Measure-Object -Sum Length
या इससे कम:
ls -r | measure -sum Length
यदि आप इसे पसंद करते हैं:
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" }
}
आप इसे सीधे से उपयोग कर सकते हैं cmd
:
powershell -noprofile -command "ls -r|measure -sum Length"
1 मेरे पास कहीं-कहीं बैच फाइलों में आंशिक रूप से समाप्त होने वाली बिग्नम लाइब्रेरी है, जो कम से कम मनमाना-सटीक पूर्णांक जोड़ देती है। मैं वास्तव में इसे जारी करना चाहिए, मुझे लगता है :-)
du
में डायरेक्टरी साइज देता है लेकिन यह सब कर रहा है पेड़ पर चल रहा है और समेट रहा है। कुछ ऐसा जो बहुत ही सहजता से यहाँ की तरह एक पाइपलाइन में व्यक्त किया जा सकता है :-)। इसलिए PowerShell के लिए मैं आमतौर पर इस बात की तलाश करता हूं कि आप उच्च-स्तरीय लक्ष्य को उपयुक्त निचले-स्तर के संचालन में कैसे विघटित कर सकते हैं।
folder\*
मेरे लिए उस फ़ोल्डर का आकार काम नहीं कर रहा है जिसे मैंने जगह दी है 0 बाइट्स दिखाता है, क्या कोई समाधान है?
उसके लिए एक अंतर्निहित विंडोज टूल है:
dir /s 'FolderName'
यह बहुत सारी अनावश्यक जानकारी को प्रिंट करेगा लेकिन अंत इस तरह से फ़ोल्डर का आकार होगा:
Total Files Listed:
12468 File(s) 182,236,556 bytes
यदि आपको छिपे हुए फ़ोल्डरों को शामिल करने की आवश्यकता है /a
।
मैं इस लिंक http://technet.microsoft.com/en-us/sysinternals/bb896651 पर Microsoft द्वारा उपलब्ध कराए गए Sysinternals सूट से उपयोगिता DU डाउनलोड करने का सुझाव देता हूं।
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
जब आप इस पर होते हैं, तो अन्य उपयोगिताओं पर एक नज़र डालें। वे हर विंडोज प्रोफेशनल के लिए एक जीवन रक्षक हैं
\\live.sysinternals.com
यदि वह अभी भी मौजूद है तो इसका उपयोग करके )। मैं तहे दिल से सहमत हूँ, हालांकि, सभी sysinternals टूल को डिफ़ॉल्ट रूप से शामिल किया जाना चाहिए। हालांकि कई उपयोगों के लिए PowerShell काफी योग्य प्रतिस्थापन है।
एक लाइन:
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"
एक ही है, लेकिन केवल शक्ति:
$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
यह निम्नलिखित परिणाम उत्पन्न करना चाहिए:
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
क्या मैं सभी फोल्डर के लिए इसे ऑप्टिमाइज़ कर सकता हूं, पहले ही एडमिन के रूप में चलने की कोशिश कर चुका हूं
ft
( Format-Table
) काम करता है। आप fl
इसके बजाय ( Format-List
)
मैं https://github.com/aleksaan/diskusage उपयोगिता का उपयोग करने की सलाह देता हूं । बहुत ही सरल और सहायक। और बहुत तेज।
बस एक कमांड शेल में टाइप करें
diskusage.exe -path 'd:/go; d:/Books'
और आकार द्वारा व्यवस्थित फ़ोल्डरों की सूची प्राप्त करें
1. | DIR: d: / go | SIZE: 325.72 एमबी | DEPTH: 1 2. | DIR: d: / Books | आकार: 14.01 एमबी | DEPTH: 1
इस उदाहरण को HDD पर 272ms पर निष्पादित किया गया था ।
उदाहरण के लिए, आप सबफ़ोल्डर की गहराई बढ़ा सकते हैं:
diskusage.exe -path 'd:/go; d:/Books' -depth 2
और न केवल चयनित फ़ोल्डर के लिए बल्कि इसके सबफ़ोल्डर्स के लिए भी आकार प्राप्त करें
1. | DIR: d: / go | SIZE: 325.72 एमबी | DEPTH: 1 2. | DIR: d: / go / pkg | SIZE: 212.88 एमबी | DEPTH: 2 3. | DIR: d: / go / src | आकार: 62.57 एमबी | DEPTH: 2 4. | DIR: d: / go / bin | आकार: 30.44 एमबी | DEPTH: 2 5. | DIR: d: / Books / शतरंज | आकार: 14.01 एमबी | DEPTH: 2 6. | DIR: d: / Books | आकार: 14.01 एमबी | DEPTH: 1 7. | DIR: d: / go / api | आकार: 6.41 एमबी | DEPTH: 2 8. | DIR: d: / go / test | आकार: 5.11 एमबी | DEPTH: 2 9. | DIR: d: / go / doc | आकार: 4.00 एमबी | DEPTH: 2 10 | DIR: d: / go / misc | आकार: 3.82 एमबी | DEPTH: 2 11. | DIR: d: / go / lib | SIZE: 358.25 Kb | DEPTH: 2
* सर्वर पर 3.5Tb को 3m12s के लिए स्कैन किया गया है
यहां एक पावरशेल कोड आता है जिसे मैं वर्तमान निर्देशिका के तहत सभी फ़ोल्डरों के लिए सूची आकार और फ़ाइल गणना के लिए लिखता हूं। अपनी आवश्यकता के अनुसार पुन: उपयोग या संशोधित करने के लिए स्वतंत्र महसूस करें।
$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}} }
यह ऑब्जेक्ट्स प्रदान करेगा (अधिक पॉवर्सशेल-ईश), 'फाइलकाउंट' और 'साइज' पूर्णांक हैं (इसलिए आप बाद में उन्हें संसाधित कर सकते हैं, यदि आवश्यक हो), और 'आकार' बाइट्स में है, लेकिन आप इसे आसानी से बदल सकते हैं GB (या इच्छित इकाई) के साथ $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}} }
इस कोड का परीक्षण किया जाता है। आप इसे फिर से देख सकते हैं।
@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
मुझे लगता है कि यह केवल तभी काम करेगा जब निर्देशिका काफी स्थिर हो और इसकी सामग्री दो dir कमांड के निष्पादन के बीच परिवर्तित न हो। शायद इससे बचने के लिए इसे एक कमांड में संयोजित करने का एक तरीका है, लेकिन यह मेरे उद्देश्य के लिए काम करता है (मुझे पूरी लिस्टिंग नहीं चाहिए; बस सारांश)।
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%
उपयोग:
GetDirSummary.bat c: \ temp
आउटपुट:
Total Files Listed:
22 File(s) 63,600 bytes
8 Dir(s) 104,350,330,880 bytes free
मैं du.exe
अपने git वितरण के साथ मिला । एक अन्य स्थान पर Microsoft या Unxutils लिखा जा सकता है ।
एक बार जब आप अपने मार्ग में du.exe मिला। यहाँ आपका 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
मुझे लगता है कि आपका एकमात्र विकल्प diruse (एक अत्यधिक समर्थित तृतीय पक्ष समाधान) होगा:
कमांड लाइन से फ़ाइल / निर्देशिका आकार प्राप्त करें
विंडोज सीएलआई दुर्भाग्य से काफी प्रतिबंधक है, आप वैकल्पिक रूप से Cygwin स्थापित कर सकते हैं जो कि cmd की तुलना में उपयोग करने का एक सपना है। यह आपको पोर्ट किए गए यूनिक्स टूल डू तक पहुंच देगा जो कि विंडोज़ पर ड्यूर्यूज़ का आधार है।
क्षमा करें, मैं आपके प्रश्नों का उत्तर सीधे उस आदेश के साथ देने में सक्षम नहीं था, जिसे आप मूल पंजा पर चला सकते हैं।
:: ऐसी कई पंक्तियाँ प्राप्त करें, जो Dir कमांड देती हैं (/ संख्या विभाजकों को समाप्त करने के लिए -c:,)] ["टोकन = 3", जो कि Dir में प्रत्येक पंक्ति के तीसरे कॉलम को देखने के लिए है]
FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO set /a i=!i!+1
प्रायद्वीप रेखा की संख्या, फ़ाइलों की संख्या के बाइट्स की संख्या है:
set /a line=%i%-1
अंत में पेन लाइन में बाइट्स की संख्या प्राप्त करें - 3 कॉलम:
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%
चूंकि यह शब्द खोज का उपयोग नहीं करता है इसलिए इसमें भाषा की समस्याएं नहीं होंगी।
सीमाएं:
प्रयत्न:
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
यदि आप चाहते हैं कि किसी भी फ़ोल्डर में C: \ Program Files बदलें और बैच फ़ाइल में उपयोग करने पर% A%% A में बदलें
यह पूरे फ़ोल्डर का आकार देता है, जिसमें सबफ़ोल्डर्स और छिपी हुई और सिस्टम फाइलें शामिल हैं, और 2GB से अधिक फ़ोल्डरों के साथ काम करता है
यह स्क्रीन पर लिखता है, इसलिए यदि आप ऐसा नहीं चाहते हैं तो आपको एक अंतरिम फ़ाइल का उपयोग करना होगा।
निम्नलिखित स्क्रिप्ट का उपयोग किसी दिए गए फ़ोल्डर के तहत प्रत्येक फ़ाइल का आकार लाने और संचित करने के लिए किया जा सकता है।
फ़ोल्डर %folder%
स्क्रिप्ट को इस स्क्रिप्ट के तर्क के रूप में दिया जा सकता है ( %1
)।
अंततः, परिणाम पैरामीटर में आयोजित किया जाता है%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
नोट: विधि calcAccSize
फ़ोल्डर की सामग्री को भी प्रिंट कर सकती है (ऊपर उदाहरण में टिप्पणी की गई है)
तो यहाँ आपके अनुरोधों के लिए एक समाधान है जिस तरीके से आपने मूल रूप से पूछा था। यह मानव पठनीयता को फाइलों की सीमा के बिना फाइल कर देगा जो सभी को अनुभव हो रहा है। विस्टा या नए के साथ संगत। यदि Robocopy स्थापित है तो केवल XP उपलब्ध है। बस इस बैच फ़ाइल पर एक फ़ोल्डर ड्रॉप करें या नीचे बताए गए बेहतर तरीके का उपयोग करें।
@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
इस बैच फ़ाइल का उपयोग करने में सक्षम होने के लिए इसे अपने SendTo फ़ोल्डर में रखें। यह आपको फ़ोल्डर या फ़ोल्डर के चयन पर राइट-क्लिक करने, SendTo विकल्प पर क्लिक करने और फिर इस बैच फ़ाइल का चयन करने की अनुमति देगा।
अपने कंप्यूटर पर SendTo फोल्डर को सबसे सरल तरीके से खोजने के लिए cmd को खोलना है फिर इस लाइन में कॉपी करें।
explorer C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo
मैंने इसी तरह की समस्या को हल किया। इस पृष्ठ की कुछ विधियाँ धीमी हैं और कुछ बहुभाषी वातावरण में समस्याग्रस्त हैं (सभी मान लेते हैं कि अंग्रेजी)। मुझे cmd में vbscript का उपयोग करके सरल वर्कअराउंड मिला। इसका परीक्षण W2012R2 और 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))
यह पर्यावरण चर S_ सेट करता है। आप निश्चित रूप से अंतिम पंक्ति को बदल कर सीधे परिणाम के उदाहरण के लिए प्रदर्शित कर सकते हैं
FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (ECHO "Size of %1 is %%?"&&(DEL %TEMP%\_SFSTMP$.VBS))
आप इसे सबरूटीन के रूप में या स्टैंडअलोन सेमीड के रूप में उपयोग कर सकते हैं। पैरामीटर उद्धरणों में बंद परीक्षण किए गए फ़ोल्डर का नाम है।