derregistrar
Goto Top

Background Switcher - BATCH

Hilfe zur Programmierung erwünscht.

Hallo Leute!

vielen Dank für dieses tolle Forum!!

Mein Problem...

Hintergrund:
Ich bin schon wieder einige Stunden damit beschäftigt, den Laptop meiner werten Mutti etwas mehr zu automatisieren.
Um meine Idee umsetzen zu können, benötige ich die Funktion, per Batch den Hintergrund zu wechseln, dafür erschließen sich mehrere Möglichkeiten.

Einfach Programm aus dem Internet nutzen? - Will ich nicht! - Warum:
Dies lässt sich mit zwar mit externen Programmen realisieren, jedoch fehlt mir darin einfach die Transparenz, da solche Programme nicht OpenSource sind und ich mich bzw. meine Mutti 1. Performancemässig im Nachteil sehe, außerdem 2. Die Sicherheit fehlt, dass das Programm keinen Quatsch anstellt (Ala unnötige Registry-/Dll-/Treiber-Einträge o. ä.). - Das System soll ABSOLUT SAUBER vor solchem Quatsch bleiben, deswegen kommen auch nur die nötigsten und sinnvollsten Programme auf diesen Rechner.
Ich bitte diesbezüglich keine Diskussion anzufangen, ich möchte schließlich einen Lösungsweg zu meinem Problem der Realisierung dieser Idee (Das selbstständige Programmieren/Scripten einer solchen Dienstleistung) und nicht des (nichtvorhandenen Problemes) der "Nicht-Einsicht" bzw. der Nichtakzeptierung fremder Software. - Sofern das jemand annehmen sollte. - Ich möchte nicht diskutieren wie sinnvoll es ist, denn das ist es für mich.
- Gebe ich nur deswegen an, da in vielen Foren diskutiert wird warum und wie sehr man etwas möchte -

Meine Realisierungsidee:
Ich wollte das ganze nun per BATCH-Script realisieren, konnte schon einen Lösungsweg erarbeiten:
Bei einem Neustart war dann einfach ein anderer Hintergrund zu sehen ;) - Das Script lief beim Autostart durch.

--- Alter (funktionsfähiger) Code:
@echo off
setlocal enabledelayedexpansion
dir /b "*.jpg" /s |find /c /v "" > count.txt  
Set /P _count=<count.txt
del count.txt
echo Count:%_count%
Set /a Number=(%Random% %%(%_count%))+1
set /a c=0
echo Choose:%Number%
FOR /F "tokens=* delims=, " %%G in ('dir /b /s *.jpg') DO (  
rem echo TRY:%%G
set /a c+=1
if [!c!]==[!Number!] ( set file="%%G"  
goto :change ) )
:change
echo %file%
echo return
reg add "HKCU\Control Panel\Desktop" /v "Wallpaper" /d "%file%" /t REG_SZ /f  

Leider ist dieser Lösungsweg nicht optimal, da ich das Gefühl habe, das Script wähle die Bildschirmhintergründe zu "unzufällig" und zu häufig wiederholend die selben Hintergrundbilder aus.

Was das aktuelle Script konkret tun soll:
1. Anstatt einem Registry Eintrag, ersetzt es die als Hintergrundgrafik gesetzte .jpg Datei, indem es als solche benannt in das entsprechende Verzeichnis kopiert wird. - Soweit kein Problem
2. Nun soll die gerade ausgewählte Grafik in einen anderen Ordner verschoben werden, damit diese bei den nächsten Starts nicht wieder ausgewählt werden kann. - Soweit kein Problem
3. Jetzt aber, soll wenn ALLE Hintergrundbilder in den neuen Ordner verschoben wurden, sprich wenn der Wallpaper-Pool leer ist, alle Wallpaper wieder in den Pool verschoben werden. - Das ist das Problem. [EDIT: AKTUALISIERT] Wo und wie mache ich das? Meine Versuche haben nicht geklappt, habe sie deshalb aus dem Code gelöscht.

---Der Code dazu lautet:
:start
setlocal enabledelayedexpansion
dir /b "C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpapersPool\*.jpg" /s |find /c /v "" > count.txt  
Set /P _count=<count.txt
del count.txt
echo Count:%_count%
Set /a Number=(%Random% %%(%_count%))+1
set /a c=0

:chose

FOR /F "tokens=* delims=, " %%G in ('dir /b "C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpapersPool\*.jpg"') DO (  
rem echo TRY:%%G
set /a e+=1
if [!e!]==[!Number!] ( set fname="%%G"  
goto :change ) )

:change
echo %file%
del "C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpapersActive\Background.jpg"  
copy C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpapersPool\%fname% C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpaperActive\Background.jpg
move C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpapersPool\%fname% C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpapersUsed\%fname%

[/EDIT]

Wie Ihr sicher schon herausgelesen habt - besonders viel Erfahrung in VBS oder BATCH habe ich nicht, dennoch gebe ich mir alle Mühe.
Das einzige was ich relativ gut kenne ist LSL (Linden Scripting Language) und HTML.

Wie also könnte ich es noch realisieren?
Kann ich etwas besser machen (Fehler)?
Konstruktive Kritik oder Verbesserungsvorschläge sind herzlichst erwünscht.

Mit lieben Gruß
Der Registrar

Content-Key: 159503

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

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

Mitglied: 60730
60730 Jan 26, 2011 at 17:11:48 (UTC)
Goto Top
Salü,

kleine Gegenfrage - wieviele Bilder sind denn in dem Ordner?

Gruß
Member: DerRegistrar
DerRegistrar Jan 26, 2011 at 17:13:55 (UTC)
Goto Top
Hi Timo!!!

Ich habe mal durchzählen lassen, ingesamt sind derzeit 173 Wallpaper vorhanden. ( Nur die besten face-smile )

LG

[EDIT: HINWEIS] Achtung, ich habe den Beitrag aktualisiert [/EDIT]
Mitglied: 60730
60730 Jan 26, 2011 at 18:53:09 (UTC)
Goto Top
Servus,
ungetestet und außer einer Variablen nur eine Abfrage gezimmert, die sicherstellt, dass die Badewanne der Pool wieder gefüllt wird.

:start
setlocal enabledelayedexpansion
set Pool="C:\Users\User\Pictures\Wallpaper\WallpaperChanger"  

dir /b "%Pool%\WallpapersPool\*.jpg" /s |find /c /v "" > count.txt  
Set /P _count=<count.txt
del count.txt
echo Count:%_count%
Set /a Number=(%Random% %%(%_count%))+1
set /a c=0

:chose

FOR /F "tokens=* delims=, " %%G in ('dir /b "%Pool%\WallpapersPool\*.jpg"') DO (  
rem echo TRY:%%G
set /a e+=1
if [!e!]==[!Number!] ( set fname="%%G"  
goto :change ) )

:change
echo %file%
del "%Pool%\WallpapersActive\Background.jpg"  
copy %Pool%\WallpapersPool\%fname% %Pool%\WallpaperActive\Background.jpg
move %Pool%\WallpapersPool\%fname% %Pool%\WallpapersUsed\%fname%

for /f %%z in ('dir %Pool%\WallpapersPool\*.jpg ^|find "Datei(en)"') do if %%z leq 1 move %Pool%\WallpapersUsed\*.jpg %Pool%\WallpapersPool\  

Bei 173 Dateien wirds mit dem Zufall halt sehr Zufällig, daher ist das mit derm Verschieben eine passable Idee.

Gruß
Member: bastla
bastla Jan 26, 2011 at 19:20:47 (UTC)
Goto Top
... und noch etwas eingedampft (sowie getestet face-wink):
@echo off & setlocal
set "Pool=C:\Users\User\Pictures\Wallpaper\WallpaperChanger"  

if not exist "%Pool%\WallpapersPool\*.jpg" move "%Pool%\WallpapersUsed\*.jpg" "%Pool%\WallpapersPool\" >nul  

for /f %%i in ('dir "%Pool%\WallpapersPool\*.jpg"^|findstr "Datei(en)"') do set _count=%%i  
echo Count:%_count%

set /a Number=(%Random% %% %_count%)+1

:chose
for /f "tokens=1* delims=:" %%g in ('dir /b "%Pool%\WallpapersPool\*.jpg" 2^>nul^|findstr /n "^" ^|findstr /b "%Number%:"') do set "fname=%%h"  

:change
echo %fname%
copy "%Pool%\WallpapersPool\%fname%" "%Pool%\WallpaperActive\Background.jpg" >nul  
move "%Pool%\WallpapersPool\%fname%" "%Pool%\WallpapersUsed\"  
Grüße
bastla

P.S.: Beim verwendeten BS handelt es sich wohl um Vista - 7 bräuchte ja noch nicht mal diesen Batch (siehe etwa hier) ...
Member: DerRegistrar
DerRegistrar Jan 26, 2011 at 19:28:36 (UTC)
Goto Top
Na Servus! (Auch Bayer?! face-big-smile)

Ich hab deinen Code getestet und die Variable Pool in WPC (Wallpaperchange) umbenannt. (Was aber nicht das Problem sein sollte).
Leider wird, sobald schon der letzte Wallpaper aus dem WallpapersPool\ Ordner verschwindet, keine erwartete Aktion durchgeführt.
Die Bilder werden auch nicht wieder zurückkopiert.

Die ECHO-AUSGABE: (SOBALD WallpapersPool\ leer ist)
C:\Users\User\Systemdateien\WallpaperChanger>setlocal enabledelayedexpansion 

C:\Users\User\Systemdateien\WallpaperChanger>set WPC="C:\Users\User\Pictures\Wallpaper\WallpaperChanger"   

C:\Users\User\Systemdateien\WallpaperChanger>dir /b ""C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersPool\*.jpg" /s   | find /c /v ""  1>count.txt   

C:\Users\User\Systemdateien\WallpaperChanger>Set /P _count= 0<count.txt 

C:\Users\User\Systemdateien\WallpaperChanger>del count.txt 

C:\Users\User\Systemdateien\WallpaperChanger>echo Count:0 
Count:0

C:\Users\User\Systemdateien\WallpaperChanger>Set /a Number=(5185 %(0))+1 

C:\Users\User\Systemdateien\WallpaperChanger>set /a c=0 

C:\Users\User\Systemdateien\WallpaperChanger>FOR /F "tokens=* delims=, " %G in ('dir /b ""C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersPool\*.jpg"') DO (  
rem echo TRY:%G  
 set /a e+=1  
 if [!e!] == [!Number!] (
set fname="%G"    
 goto :change  
) 
) 

C:\Users\User\Systemdateien\WallpaperChanger>echo  
ECHO ist eingeschaltet (ON).

C:\Users\User\Systemdateien\WallpaperChanger>del ""C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersActive\Background.jpg"   

C:\Users\User\Systemdateien\WallpaperChanger>copy "C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersPool\ "C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpaperActive\Background.jpg   
C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpapersPool\* 
        0 Datei(en) kopiert.

C:\Users\User\Systemdateien\WallpaperChanger>move "C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersPool\ "C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersUsed\   

C:\Users\User\Systemdateien\WallpaperChanger>for /F %z in ('dir "C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersPool\*.jpg |find "Datei(en)"') do if %z LEQ 1 move "C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersUsed\*.jpg "C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersPool\   



Der Code dazu:
:start
setlocal enabledelayedexpansion
set WPC="C:\Users\User\Pictures\Wallpaper\WallpaperChanger"  

dir /b "%WPC%\WallpapersPool\*.jpg" /s |find /c /v "" > count.txt  
Set /P _count=<count.txt
del count.txt
echo Count:%_count%
Set /a Number=(%Random% %%(%_count%))+1
set /a c=0

:chose

FOR /F "tokens=* delims=, " %%G in ('dir /b "%WPC%\WallpapersPool\*.jpg"') DO (  
rem echo TRY:%%G
set /a e+=1
if [!e!]==[!Number!] ( set fname="%%G"  
goto :change ) )

:change
echo %file%
del "%WPC%\WallpapersActive\Background.jpg"  
copy %WPC%\WallpapersPool\%fname% %WPC%\WallpaperActive\Background.jpg
move %WPC%\WallpapersPool\%fname% %WPC%\WallpapersUsed\%fname%

for /f %%z in ('dir %WPC%\WallpapersPool\*.jpg ^|find "Datei(en)"') do if %%z leq 1 move %WPC%\WallpapersUsed\*.jpg %WPC%\WallpapersPool\  
Member: DerRegistrar
DerRegistrar Jan 26, 2011 at 19:48:16 (UTC)
Goto Top
Hi Bastla!!

Richtig, es handelt sich um Windows Vista 32-Bit.
Mit deinem Code funktioniert es übrigens PERFEKT!

Ich bin unglaublich angetan davon, was mach mit einem simplen Batch anstellen kann... wozu diese ganzen lästigen Programme aus dem Internet, die den PC unnötig verlangsamen....

Aber eins ist mir klar geworden: KOMPLIZIERT!!!

Vielen Dank für Eure Hilfe!!!!!!

LG
Member: DerRegistrar
DerRegistrar Jan 26, 2011 at 19:50:54 (UTC)
Goto Top
Mein Finaler Code:
@echo off & setlocal
set "Pool=C:\Users\User\Pictures\Wallpaper\WallpaperChanger"  

if not exist "%Pool%\WallpapersPool\*.jpg" move "%Pool%\WallpapersUsed\*.jpg" "%Pool%\WallpapersPool\" >nul  

for /f %%i in ('dir "%Pool%\WallpapersPool\*.jpg"^|findstr "Datei(en)"') do set _count=%%i  
echo Count:%_count%

set /a Number=(%Random% %% %_count%)+1

:chose
for /f "tokens=1* delims=:" %%g in ('dir /b "%Pool%\WallpapersPool\*.jpg" 2^>nul^|findstr /n "^" ^|findstr /b "%Number%:"') do set "fname=%%h"  

:change
echo %fname%
copy "%Pool%\WallpapersPool\%fname%" "%Pool%\WallpaperActive\Background.jpg" >nul  
move "%Pool%\WallpapersPool\%fname%" "%Pool%\WallpapersUsed\"  
Member: bastla
bastla Jan 26, 2011 at 20:11:34 (UTC)
Goto Top
Hallo DerRegistrar, und ein nachträgliches Willkommen im Forum!
KOMPLIZIERT!!!
kann sich ja eigentlich nur auf diese Zeile beziehen (den Rest hattest Du ja bereits in ähnlicher Form):
for /f "tokens=1* delims=:" %%g in ('dir /b "%Pool%\WallpapersPool\*.jpg" 2^>nul^|findstr /n "^" ^|findstr /b "%Number%:"') do set "fname=%%h"
Damit's vielleicht etwas verständlicher wird:
dir /b "%Pool%\WallpapersPool\*.jpg" 2^>nul^|findstr /n "^" ^|findstr /b "%Number%:"
- falls Du an der Kommandozeile testen willst:
dir /b "%Pool%\WallpapersPool\*.jpg" 2>nul|findstr /n "^"|findstr /b "%Number%:"
- listet alle *.jpg-Dateien auf, nummeriert diese (es wird nach "^" = Zeilenanfang gesucht, und den hat jede Zeile, womit also alle Dateien erfasst werden) und danach jene Zeile = Datei ermittelt, deren Nummer mit der vorher festgelegten %Number% übereinstimmt.

Da letztlich nur der Dateiname, nicht aber auch die laufende Nummer benötigt wird, erfolgt eine Unterteilung der Zeile (per "for /f") anhand des auf die Nummer folgenden Doppelpunktes: der Teil davor wird %%g, der Teil danach %%h - and that's all ...

Grüße
bastla
Member: Biber
Biber Jan 26, 2011 at 20:16:35 (UTC)
Goto Top
Moin Registrar,

willkommen im Forum.

Ich bin sehr angetan von deiner Art des Fragestellens und der Sorgfalt und Mühe, die du dir gibst.
Natürlich ebenso angetan von den hochkarätigen Antworten und der schnellen Lösung.

Deshalb habe ich auch mal -was nicht jede Woche vorkommt- einen "Anspruchsvoll-Smiley" für angemessen erhalten.

Danke für diesen Beitrag an alle.

Grüße
Biber
P.S. Dein "finaler Code" ist doch eigentlich erhaltenswert und wiederverwendbar ....
...vielleicht solltest du noch ein paar Kommentarzeilen einfügen, falls deine Mutti da mal reinguckt.
Das nackte und unkommentierte Endergebnis dieser Diskussion wirst vermutlich auch du in 3 Monaten nicht mehr auf Anhieb nachvollziehen können.
P.P.S. Die eine oder andere Kommentierung könnte jetzt von bastlas zeitgleichem wieder mal schnelleren Kommentar 26.01.2011, 21:11:34 Uhr übernommen werden face-wink