bingoblin
Goto Top

Ordner-Icon auf Grundlage der Ordnergröße ändern : Laufzeit Verkürzung bei Bestimmung der Ordnergröße

Moin,

ich versuche mit Hilfe einer Batch-File die Größe von Ordnern zu bestimmen und ab einer bestimmten Größe das Icon des Ordners zu ändern.
Mein erster Versuch hat auch funktioniert, nur leider hat das Durchlaufen der Struktur mehrere Stunden gedauert. Aus diesem Grund habe ich das Programm etwas angepasst.
Die Anpassung zielt darauf ab, dass ich nicht die gesamte Größe des Ordners bestimme, sondern schon bei einer bestimmten Größe die For-Schleife abbreche. Durch meine Recherchen in dem Forum habe ich jedoch gehört, dass dies eine schlechte Idee ist, da es nicht vorgesehen ist die For-Schleifen abzubrechen.
Hat vielleicht jemand eine Idee wie man das Problem lösen kann?

Der Code des ersten Versuches (Laufzeit mehrere Stunden):
for /d /r "DATEIPFAD" %%t in (*) do (  

	set datei="%%~t"  

	for /f "tokens=1-3" %%i in ('dir !datei! /-C /S ^|find "Datei(en)" ^|find "Bytes"') do set dateigroesse=%%k  
	if !dateigroesse! GEQ 20000 (
		attrib -r "%%~t"  
		attrib -s -h -r "%%~t\Desktop.ini"  
		echo [.ShellClassInfo] > "%%~t\Desktop.ini"  
		echo IconResource=%SystemRoot%\system32\SHELL32.dll,266 >> "%%~t\Desktop.ini"  
		echo [ViewState] >> "%%~t\Desktop.ini"  
		echo Mode= >> "%%~t\Desktop.ini"  
		echo Vid= >> "%%~t\Desktop.ini"  
		echo FolderType=Generic >> "%%~t\Desktop.ini"  
		attrib +s +h +r "%%~t\Desktop.ini"  
		attrib +r "%%~t"  
		set dateigroesse=0
	) else (
		attrib -r "%%~t"  
		attrib -s -h -r "%%~t\Desktop.ini"  
		echo [.ShellClassInfo] > "%%~t\Desktop.ini"  
		echo IconResource=%SystemRoot%\system32\SHELL32.dll,3 >> "%%~t\Desktop.ini"  
		echo [ViewState] >> "%%~t\Desktop.ini"  
		echo Mode= >> "%%~t\Desktop.ini"  
		echo Vid= >> "%%~t\Desktop.ini"  
		echo FolderType=Generic >> "%%~t\Desktop.ini"  
		attrib +s +h +r "%%~t\Desktop.ini"  
		attrib +r "%%~t"  
		set dateigroesse=0
	)
)
pause

Mein Lösungsansatz zum Abkürzen (Abbrechen der FOR-Schleife zum Ermitteln der Ordnergröße funktioniert noch nicht):
@echo off
setlocal EnableDelayedExpansion

for /d /r "DATEIPFAD" %%t in (*) do (  
	set datei="%%~t"  
	set datei2=%%~t
	set done=0
	for /f "tokens=1-3" %%i in ('dir !datei! /-C /S ^|find "Datei(en)" ^|find "Bytes"') do if %%k GEQ 5000 call :BIG & ?ABBRECHEN?  

	call :SMALL
)

goto :eof

:BIG
	echo "BIG"  
	attrib -r "%datei2%"  
	attrib -s -h -r "%datei2%\Desktop.ini"  
	echo [.ShellClassInfo] > "%datei2%\Desktop.ini"  
	echo IconResource=%SystemRoot%\system32\SHELL32.dll,266 >> "%datei2%\Desktop.ini"  
	echo [ViewState] >> "%datei2%\Desktop.ini"  
	echo Mode= >> "%datei2%\Desktop.ini"  
	echo Vid= >> "%datei2%\Desktop.ini"  
	echo FolderType=Generic >> "%datei2%\Desktop.ini"  
	attrib +s +h +r "%datei2%\Desktop.ini"  
	attrib +r "%datei2%"  
	set done=1


:SMALL
	echo "SMALL"  
	if done NEQ 1 (
		attrib -r "%datei2%"  
		attrib -s -h -r "%datei2%\Desktop.ini"  
		echo [.ShellClassInfo] > "%datei2%\Desktop.ini"  
		echo IconResource=%SystemRoot%\system32\SHELL32.dll,3 >> "%datei2%\Desktop.ini"  
		echo [ViewState] >> "%datei2%\Desktop.ini"  
		echo Mode= >> "%datei2%\Desktop.ini"  
		echo Vid= >> "%datei2%\Desktop.ini"  
		echo FolderType=Generic >> "%datei2%\Desktop.ini"  
		attrib +s +h +r "%datei2%\Desktop.ini"  
		attrib +r "%datei2%"  
	)

Content-Key: 545814

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

Printed on: April 28, 2024 at 12:04 o'clock

Member: emeriks
emeriks Feb 11, 2020 at 07:34:45 (UTC)
Goto Top
Hi,
muss es unbedingt Batch sein? Mit PowerShell bekommt man sowas wesentlich einfacher geregelt. In Kombi mit ein Bisschen C# oder VB.net ist das dann sogar recht schnell. Da könnte man dann auch in mehreren Threads rechnen lassen.

E.
Member: Bingoblin
Bingoblin Feb 11, 2020 at 07:50:38 (UTC)
Goto Top
Theoretisch könnte es auch mit PowerShell gelöst werden, jedoch habe ich damit noch nicht gearbeitet.
Wie aufwendig ist es PowerShell zu erlernen um das Problem zu lösen?
Member: emeriks
emeriks Feb 11, 2020 at 08:05:54 (UTC)
Goto Top
Zitat von @Bingoblin:
Wie aufwendig ist es PowerShell zu erlernen um das Problem zu lösen?
Keine Ahnung, wie begabt Du da bist. Hast Du je schon mal mit C# oder VB.Net gearbeitet?
Rein mit PowerShell, ohne C# oder VB.Net, geht es auch.
Hier mal ein Bsp: (erster Treffer bei Google)
PowerShell: Calculating Folder Sizes
Mitglied: 142970
142970 Feb 11, 2020 updated at 09:48:42 (UTC)
Goto Top
Zitat von @Bingoblin:

Theoretisch könnte es auch mit PowerShell gelöst werden
Schau in deinen letzten Thread, da steht doch schon wie's gehen kann
Kombination for-Schleifen und if-Anweisung