90776
Goto Top

Ordnergrösse und , oder Anzahl der Dateien per Batch , VB auslesen

Hallo

Wie der Titiel schon sagt suche ich eine Möglichkeit die Ordnergrösse und , oder Anzahl der Dateien auszulesen.

Hintergrund:
Robocopy mit der anzeige

???MB von ???MB kopiert
oder
??? Dateien von ??? Dateien kopiert

Dank und Gruss
Switcher

Content-Key: 146169

Url: https://administrator.de/contentid/146169

Printed on: April 19, 2024 at 22:04 o'clock

Member: kkboy94
kkboy94 Jul 04, 2010 at 11:01:07 (UTC)
Goto Top
Also ein Script um die Ordnergröße auszulesen, hat Biber oder bastla (weiß ich nicht mehr genau) geschrieben:
set "FS="
set "FS=%temp%\GetFolderSize.vbs

set "ZO="
set "ZO=..."      <-- Hier deinen Ordner angeben, von dem du die Größe haben willst

echo WScript.Echo Int(CreateObject("Scripting.FileSystemObject").GetFolder(WScript.Arguments(0)).Size/1024/1024+.99)>%FS%
for /f %%g in ('cscript //nologo %FS% "%ZO%"') do set OGr=%%g
echo %OGr%

Und mit Robocopy bin ich überfragt, damit hab ich mich noch nie beschäftigt. Aber ich kann mir vorstellen, dass man, um die Anzahl der Dateien/Ordner rauszubekommen, den Befehl "Dir" nimmt.


MfG Karsten
Member: Biber
Biber Jul 04, 2010 at 11:25:49 (UTC)
Goto Top
Moin switcher94,

ergänzend zu kkboy94s Hinweisen noch zwei bis drei Anmerkungen

1) es gibt einige CmdLine-Utilities, die nur für diesen Zweck "Dateien und Dateigrößen eines Ordners inklusive Unterordner" geschrieben wurden.
Und die es hübsch kompakt und vor allem schnell anzeigen. "diruse", "diskusage" oder "du" wären ein paar übliche Namen.

2) unter VB/VBSkript ist eine der üblichen ersten Lauflern- und Turnübungen genau dieses rekursive Ordnerdurchwackeln und durchzählen.
Dazu findest du im Netz sicherlich ein paar Tonnen Beispielsourcen.

3) und zu guter Letzt:
???MB von ???MB kopiert
oder
??? Dateien von ??? Dateien kopiert
Who cares? What says it out... bzw. was transportiert das für relevante Informationen?

Oder willst du eine Fortschrittsanzeige zusammenlügen?
Wenn ja:
Für wen? Wer braucht es, wer würde dafür den Aufwand bezahlen?

Grüße
Biber
Member: kkboy94
kkboy94 Jul 04, 2010 at 11:40:49 (UTC)
Goto Top
Ist eine Fortschrittsanzeige wirklich so schwer, bzw. ist der Aufwand so groß.
Ich hab vor kurzem mal sowas erstellt:
cls
echo Warten
ping -n 2 localhost >nul
cls
echo Warten.
ping -n 2 localhost >nul
cls 
echo Warten..
ping -n 2 localhost >nul
cls 
echo Warten...
ping -n 2 localhost >nul
cls 
echo Warten....
Dann wird zwar jedesmal wieder der Bildschirm gelöscht, aber es funktioniert.
Bei einer Fortschrittsanzeige für Robocopy müsste doch dann jede einzelne Datei einzeln kopiert werden, oder?

MfG Karsten
Mitglied: 90776
90776 Jul 04, 2010 at 11:43:45 (UTC)
Goto Top
Danke erstmal

Es geht eigentlich nur um ausprobieren, tüfteln, etc.

Und jein Biber es geht zum Teil um eine Fortschrittsanzeige, denn ich habe noch 5 Wochen Schulferien und wollte ein bisschen rumpropbieren

Gruss
Switcher
Member: kkboy94
kkboy94 Jul 04, 2010 at 11:50:30 (UTC)
Goto Top
Ich meine auch, es gab hier im Forum schonmal Ansätze fürs Zählen von Ordnern/Dateien. Such einfach mal ein bisschen.
Und wenn du genau weißt, welche Ordner/Dateien zu kopieren sind, kannst du ja einfach für jede Datei einen eigenen Befehl zusammenschustern, und dann in mein Beispiel anstatt des "echo Warten" einfügen.

MfG Karsten


PS: Du sagst ja "Es geht eigentlich nur um ausprobieren, tüfteln, etc.". Mach das doch einfach mal und poste deine Ergebnisse. Nix für ungut face-wink
Member: Biber
Biber Jul 04, 2010 at 12:07:26 (UTC)
Goto Top
Moin Zwitscher,

Zitat von @90776:
Danke erstmal

Es geht eigentlich nur um ausprobieren, tüfteln, etc.

Und jein Biber es geht zum Teil um eine Fortschrittsanzeige, denn ich habe noch 5 Wochen Schulferien und wollte ein bisschen
rumpropbieren
Na ja, da wäre ich bestimmt der Letzte, der versuchen würde, jemand vom Ausprobieren und tüfteln abzuhalten
Wichtig ist nur, dass du eben auch das Vorzeichen kennst - es ist toll und ein echtes Erfolgserlebnis, so etwas hinzubekommen.
Aber den Aufwand wird dir keiner bezahlen.

Zu zweiten - da Xcopy/Robocopy/NTBackup etc monolithische Befehle sind, die dir NICHT erlauben innerhalb des "Starte-Kopiererei" bis "Ende-Kopiererei"-Blocks bei dem Ereignis "Habe eine einzelne Datei kopiert" einzugreifen....
--> dann musst du die ganze rekursive Verzeichnisstruktur-Kopiererei auch selbst programmieren.

Lass dich nicht davon abschrecken... es übt.

P.S. Wenn du damit fertig bist - was machst du mit restlichen 4 Wochen 6 1/2 Tagen Schulferien? *g

Grüße
Biber
Mitglied: 90776
90776 Jul 04, 2010 at 13:40:03 (UTC)
Goto Top
Bin fast fertig

Ich habe nur noch ein problem

Das Ordnergrössenscript, dass KKboy94 gepostet hat funktioniert perfekt,
aber wie müsste es aussehen wenn man die grösse (belegte grösse eines gesammten Laufwerks auslesen möchte,
oder den gesamten inhalt (Ordner und Dateien)

Wenn das Script funktioniert poste ich es

Gruss
Switcher
Member: kkboy94
kkboy94 Jul 04, 2010 at 13:55:30 (UTC)
Goto Top
Hmm, ich glaube nicht, dass man die BELEGTE größe auslesen kann, bzw. ich weiß nicht wie das mit Boardmitteln gehen sollte.

MfG Karsten
Member: rubberman
rubberman Jul 04, 2010 at 14:43:34 (UTC)
Goto Top
Hallo switcher94,

DIR /S könnte dir helfen (aber für Laufzeiten von dreiundzwanzigeinhalb Stunden kann ich keine Gewähr übernehmen).

@echo off &setlocal
for /f "tokens=3" %%i in ('dir /-c /s D:\^|findstr /b /c:" "') do (  
  call set "belegt=%%frei%%"  
  set "frei=%%i"  
)
echo Belegt: %belegt% Bytes
echo Frei: %frei% Bytes
pause

<EDIT>
findstr könnte es etwas beschleunigen

Falls du ausreichend Rechte hast, kannst du dir auch mal die Ausgabe von
fsutil volume diskfree D:
ansehen.

<EDIT>


Grüße
rubberman
Mitglied: 90776
90776 Jul 04, 2010 at 16:08:48 (UTC)
Goto Top
Danke
Das Erste Beispiel hat funktioniert

aber es ist ein neues Problem aufgetaucht:

Wie finde ich heraus Ob der Angegebene Pfad ein Laufwerk (also Dface-smile oder ein Ordner (also D:\Test) ist

Grüsse
Switcher
Member: rubberman
rubberman Jul 04, 2010 at 16:46:47 (UTC)
Goto Top
Hallo switcher94,

versuchs mal so:
@echo off &setlocal
set "yourPath=D:\Test"  
for /f "delims=:\/ tokens=1,2" %%a in ("%yourPath%") do (  
  if "%%b"=="" (  
    echo %yourPath% is DRIVE
  ) else (
    echo %yourPath% is DIRECTORY
  )
)

pause

Grüße
rubberman
Mitglied: 90776
90776 Jul 04, 2010 at 20:01:44 (UTC)
Goto Top
Danke an alle

Hier das fertige Script:

::Copyright© 2010 Switcher::

@echo off
set Stellen=0
set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1))>%R%
for /f %%i in ('cscript //nologo %R% "10*100" 0') do set Gruppierung=%%i  
if %Gruppierung% EQU 1'000 goto Gruppierung  

set /p Quelle=Bitte Quelle angeben: 
set /p Ziel=Bitte Ziel angeben: 
if not exist %Quelle% goto Fehler
if not exist %Ziel% goto Fehler

set Starttime=%time:~0,2%:%time:~3,2%:%time:~6,2%
for /f "tokens=1-3 delims=:," %%i in ("%time%") do set /a start=%%i*3600+60*(1%%j %% 100)+1%%k-100 1>nul 2>nul  

for /f "delims=:\/ tokens=1,2" %%a in ("%Quelle%") do (  
  if "%%b"=="" (  
    set Quellpfad=Laufwerk
  ) else (
    set Quellpfad=Ordner
  )
)
for /f "delims=:\/ tokens=1,2" %%a in ("%Ziel%") do (  
  if "%%b"=="" (  
    set Zielpfad=Laufwerk
  ) else (
    set Zielpfad=Ordner
  )
)

if (%Quellpfad% EQU Laufwerk if %Zielpfad% EQU Laufwerk) { 
goto loop1
 } else if (%Quellpfad% EQU Laufwerk if %Zielpfad% EQU Ordner) { 
goto loop2
 } else if (%Quellpfad% EQU Ordner if %Zielpfad% EQU Laufwerk) { 
goto loop3
 } else if (%Quellpfad% EQU Ordner if %Zielpfad% EQU Ordner) { 
goto loop4
 } else {
  echo goto Fehler
 }

::HIER BEFEHLE EINFÜGEN::

:loop1
::Quelle=Laufwerk Ziel=Laufwerk
echo.
for /f "tokens=3" %%i in ('dir /-c /s %Quelle%^|findstr /b /c:" "') do (  
  call set "belegt=%%frei%%"  
  set "frei=%%i"  
)
set Stellen=0
set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1))>%R%
for /f %%i in ('cscript //nologo %R% "%Belegt%/1024/1024" %Stellen%') do set QuellGr=%%i  

for /f "tokens=3" %%i in ('dir /-c /s %Ziel%^|findstr /b /c:" "') do (  
  call set "belegt=%%frei%%"  
  set "frei=%%i"  
)
set Stellen=0
set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1))>%R%
for /f %%i in ('cscript //nologo %R% "%Belegt%/1024/1024" %Stellen%') do set ZielGr=%%i  

set AktuelleZeit=%time:~0,2%:%time:~3,2%:%time:~6,2%

for /f "tokens=1-3 delims=:," %%i in ("%time%") do set /a stop=%%i*3600+60*(1%%j %% 100)+1%%k-100 1>nul 2>nul  
Set /a DauerInMin=(stop-start) / 60
Set /a DauerInStd=(stop-start) / 3600
Set /a UndRestInSecs= (stop-start) - DauerInMin*60 
Set /a FmtSecs=UndRestInSecs+100
Set /a FmtMins=DauerInMin+100
Set /a FmtStds=DauerInStd+100
set Zeitdifferenz=%FmtStds:~-2%:%FmtMins:~-2%:%FmtSecs:~-2%

FOR /F "delims= " %%i in ('Dir %Quelle% /s /A-D^|find "Datei(en)"') do set QuellDat=%%i  

FOR /F "delims= " %%i in ('Dir %Ziel% /s /A-D^|find "Datei(en)"') do set ZielDat=%%i  

set Stellen=0
set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1))>%R%
for /f %%i in ('cscript //nologo %R% "%ZielGr%/%QuellGr%*100" %Stellen%') do set Prozent=%%i  

cls

echo Startzeit: %Starttime%
echo.
echo Aktuelle Zeit: %AktuelleZeit%
echo.
echo Benoetigte Zeit: %Zeitdifferenz% Stunden
echo.
echo.
echo Quellpfad: %Quelle%
echo.
echo Zielpfad: %Ziel%
echo.
echo.
echo Quellgroesse: %QuellGr% MB
echo.
echo Zielgroesse: %ZielGr% MB
echo.
echo.
echo Quelldateien: %QuellDat% Dateien
echo.
echo Zieldateien: %ZielDat% Dateien
echo.
echo.
echo.
echo %Prozent% Prozent

sleepX -m 5000
cls
goto loop1

:loop2
::Quelle=Laufwerk Ziel=Ordner
echo.
for /f "tokens=3" %%i in ('dir /-c /s %Quelle%^|findstr /b /c:" "') do (  
  call set "belegt=%%frei%%"  
  set "frei=%%i"  
)
set Stellen=0
set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1))>%R%
for /f %%i in ('cscript //nologo %R% "%Belegt%/1024/1024" %Stellen%') do set QuellGr=%%i  

set "FS="  
set "FS=%temp%\GetFolderSize.vbs  
echo WScript.Echo Int(CreateObject("Scripting.FileSystemObject").GetFolder(WScript.Arguments(0)).Size/1024/1024+.99)>%FS%  
for /f %%g in ('cscript //nologo %FS% "%Ziel%"') do set ZielGr=%%g  

set AktuelleZeit=%time:~0,2%:%time:~3,2%:%time:~6,2%

for /f "tokens=1-3 delims=:," %%i in ("%time%") do set /a stop=%%i*3600+60*(1%%j %% 100)+1%%k-100 1>nul 2>nul  
Set /a DauerInMin=(stop-start) / 60
Set /a DauerInStd=(stop-start) / 3600
Set /a UndRestInSecs= (stop-start) - DauerInMin*60 
Set /a FmtSecs=UndRestInSecs+100
Set /a FmtMins=DauerInMin+100
Set /a FmtStds=DauerInStd+100
set Zeitdifferenz=%FmtStds:~-2%:%FmtMins:~-2%:%FmtSecs:~-2%

FOR /F "delims= " %%i in ('Dir %Quelle% /s /A-D^|find "Datei(en)"') do set QuellDat=%%i  

FOR /F "delims= " %%i in ('Dir %Ziel% /s /A-D^|find "Datei(en)"') do set ZielDat=%%i  

set Stellen=0
set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1))>%R%
for /f %%i in ('cscript //nologo %R% "%ZielGr%/%QuellGr%*100" %Stellen%') do set Prozent=%%i  

cls

echo Startzeit: %Starttime%
echo.
echo Aktuelle Zeit: %AktuelleZeit%
echo.
echo Benoetigte Zeit: %Zeitdifferenz% Stunden
echo.
echo.
echo Quellpfad: %Quelle%
echo.
echo Zielpfad: %Ziel%
echo.
echo.
echo Quellgroesse: %QuellGr% MB
echo.
echo Zielgroesse: %ZielGr% MB
echo.
echo.
echo Quelldateien: %QuellDat% Dateien
echo.
echo Zieldateien: %ZielDat% Dateien
echo.
echo.
echo.
echo %Prozent% Prozent

sleepX -m 5000
cls
goto loop2

:loop3
::Quelle=Ordner Ziel=Laufwerk
echo.
set "FS="  
set "FS=%temp%\GetFolderSize.vbs  
echo WScript.Echo Int(CreateObject("Scripting.FileSystemObject").GetFolder(WScript.Arguments(0)).Size/1024/1024+.99)>%FS%  
for /f %%g in ('cscript //nologo %FS% "%Quelle%"') do set QuellGr=%%g  

for /f "tokens=3" %%i in ('dir /-c /s %Ziel%^|findstr /b /c:" "') do (  
  call set "belegt=%%frei%%"  
  set "frei=%%i"  
)
set Stellen=0
set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1))>%R%
for /f %%i in ('cscript //nologo %R% "%Belegt%/1024/1024" %Stellen%') do set ZielGr=%%i  

set AktuelleZeit=%time:~0,2%:%time:~3,2%:%time:~6,2%

for /f "tokens=1-3 delims=:," %%i in ("%time%") do set /a stop=%%i*3600+60*(1%%j %% 100)+1%%k-100 1>nul 2>nul  
Set /a DauerInMin=(stop-start) / 60
Set /a DauerInStd=(stop-start) / 3600
Set /a UndRestInSecs= (stop-start) - DauerInMin*60 
Set /a FmtSecs=UndRestInSecs+100
Set /a FmtMins=DauerInMin+100
Set /a FmtStds=DauerInStd+100
set Zeitdifferenz=%FmtStds:~-2%:%FmtMins:~-2%:%FmtSecs:~-2%

FOR /F "delims= " %%i in ('Dir %Quelle% /s /A-D^|find "Datei(en)"') do set QuellDat=%%i  

FOR /F "delims= " %%i in ('Dir %Ziel% /s /A-D^|find "Datei(en)"') do set ZielDat=%%i  

set Stellen=0
set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1))>%R%
for /f %%i in ('cscript //nologo %R% "%ZielGr%/%QuellGr%*100" %Stellen%') do set Prozent=%%i  

cls

echo Startzeit: %Starttime%
echo.
echo Aktuelle Zeit: %AktuelleZeit%
echo.
echo Benoetigte Zeit: %Zeitdifferenz% Stunden
echo.
echo.
echo Quellpfad: %Quelle%
echo.
echo Zielpfad: %Ziel%
echo.
echo.
echo Quellgroesse: %QuellGr% MB
echo.
echo Zielgroesse: %ZielGr% MB
echo.
echo.
echo Quelldateien: %QuellDat% Dateien
echo.
echo Zieldateien: %ZielDat% Dateien
echo.
echo.
echo.
echo %Prozent% Prozent

sleepX -m 5000
cls
goto loop3

:loop4
::Quelle=Ordner Ziel=Ordner
echo.
set "FS="  
set "FS=%temp%\GetFolderSize.vbs  
echo WScript.Echo Int(CreateObject("Scripting.FileSystemObject").GetFolder(WScript.Arguments(0)).Size/1024/1024+.99)>%FS%  
for /f %%g in ('cscript //nologo %FS% "%Quelle%"') do set QuellGr=%%g  

set "FS="  
set "FS=%temp%\GetFolderSize.vbs  
echo WScript.Echo Int(CreateObject("Scripting.FileSystemObject").GetFolder(WScript.Arguments(0)).Size/1024/1024+.99)>%FS%  
for /f %%g in ('cscript //nologo %FS% "%Ziel%"') do set ZielGr=%%g  

set AktuelleZeit=%time:~0,2%:%time:~3,2%:%time:~6,2%

for /f "tokens=1-3 delims=:," %%i in ("%time%") do set /a stop=%%i*3600+60*(1%%j %% 100)+1%%k-100 1>nul 2>nul  
Set /a DauerInMin=(stop-start) / 60
Set /a DauerInStd=(stop-start) / 3600
Set /a UndRestInSecs= (stop-start) - DauerInMin*60 
Set /a FmtSecs=UndRestInSecs+100
Set /a FmtMins=DauerInMin+100
Set /a FmtStds=DauerInStd+100
set Zeitdifferenz=%FmtStds:~-2%:%FmtMins:~-2%:%FmtSecs:~-2%

FOR /F "delims= " %%i in ('Dir %Quelle% /s /A-D^|find "Datei(en)"') do set QuellDat=%%i  

FOR /F "delims= " %%i in ('Dir %Ziel% /s /A-D^|find "Datei(en)"') do set ZielDat=%%i  

set Stellen=0
set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1))>%R%
for /f %%i in ('cscript //nologo %R% "%ZielGr%/%QuellGr%*100" %Stellen%') do set Prozent=%%i  

cls

echo Startzeit: %Starttime%
echo.
echo Aktuelle Zeit: %AktuelleZeit%
echo.
echo Benoetigte Zeit: %Zeitdifferenz% Stunden
echo.
echo.
echo Quellpfad: %Quelle%
echo.
echo Zielpfad: %Ziel%
echo.
echo.
echo Quellgroesse: %QuellGr% MB
echo.
echo Zielgroesse: %ZielGr% MB
echo.
echo.
echo Quelldateien: %QuellDat% Dateien
echo.
echo Zieldateien: %ZielDat% Dateien
echo.
echo.
echo.
echo %Prozent% Prozent

sleepX -m 5000
cls
goto loop4

:Gruppierung
cls
echo.
echo Fehler
echo Bitte Tausendergruppierung deaktivieren
echo.
pause
exit

:Fehler
cls
echo.
echo Fehler
echo.
pause
exit

:Fertig
attrib /S /D %Ziel% -r -s -h >nul
exit

Benötigt wird noch SleepX.exe
Download unter : http://www.westmesatech.com/sst.html

Und schauen das die Tausenderpunkte deaktiviert sind

Änderungsvorschläge einfach posen.

Danke nochmals an alle die Geholfen haben.

EDIT 1: Startzeit, Zeit, Benötigte Zeit hinzugefügt

EDIT 2: nochmals überarbeitet, Anzahl dateien hinzugefügt

EDIT 3: Test ob Tausendergruppierung deaktiviert ist

Grüsse
Switcher
Mitglied: 90776
90776 Jul 05, 2010 at 08:35:51 (UTC)
Goto Top
Ich habe noch ein Problem gefunden

for /f "tokens=3" %%i in ('dir /-c /s %Quelle%^|findstr /b /c:" "') do (  
  call set "belegt=%%frei%%"  
  set "frei=%%i"  
)
set Stellen=0
set R=%temp%\Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1))>%R%
for /f %%i in ('cscript //nologo %R% "%Belegt%/1024/1024" %Stellen%') do set MB=%%i  

Hier kommt soetwas raus:
61'250 MB

Wie bekomme ich diesen Strich weg?
61'250 MB

set QuellGr=%MB:~0,2%%MB:~3,2%%MB:~5,2%

Habs so probiert, aber es sollte Variabel sein

Grüsse
Switcher
Member: Biber
Biber Jul 05, 2010 at 09:32:41 (UTC)
Goto Top
Moin switcher94,

für die Tausender-Punkte/Striche sind zuständig
  • der fünfte Parameter der FormatNumber-Function (optional und deshalb bei dir nicht gesetzt)
  • und ggf. die "Regionalen Einstellungen", die für einen deutsch-windowsigen Rechner aber anders aussehen sollten.

Suchmaschine mal nach "Vbskript Formatnumber" und schau es dir bei einer der ersten 5 Fundstellen an.

Grüße
Biber
Mitglied: 90776
90776 Jul 05, 2010 at 14:08:33 (UTC)
Goto Top
Danke hat sich erledigt

Gruss
Switcher