Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Background Switcher - BATCH

Frage Entwicklung Batch & Shell

Mitglied: DerRegistrar

DerRegistrar (Level 1) - Jetzt verbinden

26.01.2011, aktualisiert 19:11 Uhr, 3290 Aufrufe, 9 Kommentare, 1 Danke

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:
01.
@echo off 
02.
setlocal enabledelayedexpansion 
03.
dir /b "*.jpg" /s |find /c /v "" > count.txt 
04.
Set /P _count=<count.txt 
05.
del count.txt 
06.
echo Count:%_count% 
07.
Set /a Number=(%Random% %%(%_count%))+1 
08.
set /a c=0 
09.
echo Choose:%Number% 
10.
FOR /F "tokens=* delims=, " %%G in ('dir /b /s *.jpg') DO ( 
11.
rem echo TRY:%%G 
12.
set /a c+=1 
13.
if [!c!]==[!Number!] ( set file="%%G" 
14.
goto :change ) ) 
15.
:change 
16.
echo %file% 
17.
echo return 
18.
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:
01.
:start 
02.
setlocal enabledelayedexpansion 
03.
dir /b "C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpapersPool\*.jpg" /s |find /c /v "" > count.txt 
04.
Set /P _count=<count.txt 
05.
del count.txt 
06.
echo Count:%_count% 
07.
Set /a Number=(%Random% %%(%_count%))+1 
08.
set /a c=0 
09.
 
10.
:chose 
11.
 
12.
FOR /F "tokens=* delims=, " %%G in ('dir /b "C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpapersPool\*.jpg"') DO ( 
13.
rem echo TRY:%%G 
14.
set /a e+=1 
15.
if [!e!]==[!Number!] ( set fname="%%G" 
16.
goto :change ) ) 
17.
 
18.
:change 
19.
echo %file% 
20.
del "C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpapersActive\Background.jpg" 
21.
copy C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpapersPool\%fname% C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpaperActive\Background.jpg 
22.
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
Mitglied: 60730
26.01.2011 um 18:11 Uhr
Salü,

kleine Gegenfrage - wieviele Bilder sind denn in dem Ordner?

Gruß
Bitte warten ..
Mitglied: DerRegistrar
26.01.2011 um 18:13 Uhr
Hi Timo!!!

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

LG

[EDIT: HINWEIS] Achtung, ich habe den Beitrag aktualisiert [/EDIT]
Bitte warten ..
Mitglied: 60730
26.01.2011 um 19:53 Uhr
Servus,
ungetestet und außer einer Variablen nur eine Abfrage gezimmert, die sicherstellt, dass die Badewanne der Pool wieder gefüllt wird.

01.
:start 
02.
setlocal enabledelayedexpansion 
03.
set Pool="C:\Users\User\Pictures\Wallpaper\WallpaperChanger" 
04.
 
05.
dir /b "%Pool%\WallpapersPool\*.jpg" /s |find /c /v "" > count.txt 
06.
Set /P _count=<count.txt 
07.
del count.txt 
08.
echo Count:%_count% 
09.
Set /a Number=(%Random% %%(%_count%))+1 
10.
set /a c=0 
11.
 
12.
:chose 
13.
 
14.
FOR /F "tokens=* delims=, " %%G in ('dir /b "%Pool%\WallpapersPool\*.jpg"') DO ( 
15.
rem echo TRY:%%G 
16.
set /a e+=1 
17.
if [!e!]==[!Number!] ( set fname="%%G" 
18.
goto :change ) ) 
19.
 
20.
:change 
21.
echo %file% 
22.
del "%Pool%\WallpapersActive\Background.jpg" 
23.
copy %Pool%\WallpapersPool\%fname% %Pool%\WallpaperActive\Background.jpg 
24.
move %Pool%\WallpapersPool\%fname% %Pool%\WallpapersUsed\%fname% 
25.
 
26.
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ß
Bitte warten ..
Mitglied: bastla
26.01.2011 um 20:20 Uhr
... und noch etwas eingedampft (sowie getestet ):
01.
@echo off & setlocal 
02.
set "Pool=C:\Users\User\Pictures\Wallpaper\WallpaperChanger" 
03.
 
04.
if not exist "%Pool%\WallpapersPool\*.jpg" move "%Pool%\WallpapersUsed\*.jpg" "%Pool%\WallpapersPool\" >nul 
05.
 
06.
for /f %%i in ('dir "%Pool%\WallpapersPool\*.jpg"^|findstr "Datei(en)"') do set _count=%%i 
07.
echo Count:%_count% 
08.
 
09.
set /a Number=(%Random% %% %_count%)+1 
10.
 
11.
:chose 
12.
for /f "tokens=1* delims=:" %%g in ('dir /b "%Pool%\WallpapersPool\*.jpg" 2^>nul^|findstr /n "^" ^|findstr /b "%Number%:"') do set "fname=%%h" 
13.
 
14.
:change 
15.
echo %fname% 
16.
copy "%Pool%\WallpapersPool\%fname%" "%Pool%\WallpaperActive\Background.jpg" >nul 
17.
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) ...
Bitte warten ..
Mitglied: DerRegistrar
26.01.2011 um 20:28 Uhr
Na Servus! (Auch Bayer?! )

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)
01.
 
02.
C:\Users\User\Systemdateien\WallpaperChanger>setlocal enabledelayedexpansion  
03.
 
04.
C:\Users\User\Systemdateien\WallpaperChanger>set WPC="C:\Users\User\Pictures\Wallpaper\WallpaperChanger"  
05.
 
06.
C:\Users\User\Systemdateien\WallpaperChanger>dir /b ""C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersPool\*.jpg" /s   | find /c /v ""  1>count.txt  
07.
 
08.
C:\Users\User\Systemdateien\WallpaperChanger>Set /P _count= 0<count.txt  
09.
 
10.
C:\Users\User\Systemdateien\WallpaperChanger>del count.txt  
11.
 
12.
C:\Users\User\Systemdateien\WallpaperChanger>echo Count:0  
13.
Count:0 
14.
 
15.
C:\Users\User\Systemdateien\WallpaperChanger>Set /a Number=(5185 %(0))+1  
16.
 
17.
C:\Users\User\Systemdateien\WallpaperChanger>set /a c=0  
18.
 
19.
C:\Users\User\Systemdateien\WallpaperChanger>FOR /F "tokens=* delims=, " %G in ('dir /b ""C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersPool\*.jpg"') DO ( 
20.
rem echo TRY:%G   
21.
 set /a e+=1   
22.
 if [!e!] == [!Number!] ( 
23.
set fname="%G"   
24.
 goto :change   
25.
)  
26.
)  
27.
 
28.
C:\Users\User\Systemdateien\WallpaperChanger>echo   
29.
ECHO ist eingeschaltet (ON). 
30.
 
31.
C:\Users\User\Systemdateien\WallpaperChanger>del ""C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersActive\Background.jpg"  
32.
 
33.
C:\Users\User\Systemdateien\WallpaperChanger>copy "C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersPool\ "C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpaperActive\Background.jpg  
34.
C:\Users\User\Pictures\Wallpaper\WallpaperChanger\WallpapersPool\*  
35.
        0 Datei(en) kopiert. 
36.
 
37.
C:\Users\User\Systemdateien\WallpaperChanger>move "C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersPool\ "C:\Users\User\Pictures\Wallpaper\WallpaperChanger"\WallpapersUsed\  
38.
 
39.
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:
01.
:start 
02.
setlocal enabledelayedexpansion 
03.
set WPC="C:\Users\User\Pictures\Wallpaper\WallpaperChanger" 
04.
 
05.
dir /b "%WPC%\WallpapersPool\*.jpg" /s |find /c /v "" > count.txt 
06.
Set /P _count=<count.txt 
07.
del count.txt 
08.
echo Count:%_count% 
09.
Set /a Number=(%Random% %%(%_count%))+1 
10.
set /a c=0 
11.
 
12.
:chose 
13.
 
14.
FOR /F "tokens=* delims=, " %%G in ('dir /b "%WPC%\WallpapersPool\*.jpg"') DO ( 
15.
rem echo TRY:%%G 
16.
set /a e+=1 
17.
if [!e!]==[!Number!] ( set fname="%%G" 
18.
goto :change ) ) 
19.
 
20.
:change 
21.
echo %file% 
22.
del "%WPC%\WallpapersActive\Background.jpg" 
23.
copy %WPC%\WallpapersPool\%fname% %WPC%\WallpaperActive\Background.jpg 
24.
move %WPC%\WallpapersPool\%fname% %WPC%\WallpapersUsed\%fname% 
25.
 
26.
for /f %%z in ('dir %WPC%\WallpapersPool\*.jpg ^|find "Datei(en)"') do if %%z leq 1 move %WPC%\WallpapersUsed\*.jpg %WPC%\WallpapersPool\
Bitte warten ..
Mitglied: DerRegistrar
26.01.2011 um 20:48 Uhr
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
Bitte warten ..
Mitglied: DerRegistrar
26.01.2011 um 20:50 Uhr
Mein Finaler Code:
01.
@echo off & setlocal 
02.
set "Pool=C:\Users\User\Pictures\Wallpaper\WallpaperChanger" 
03.
 
04.
if not exist "%Pool%\WallpapersPool\*.jpg" move "%Pool%\WallpapersUsed\*.jpg" "%Pool%\WallpapersPool\" >nul 
05.
 
06.
for /f %%i in ('dir "%Pool%\WallpapersPool\*.jpg"^|findstr "Datei(en)"') do set _count=%%i 
07.
echo Count:%_count% 
08.
 
09.
set /a Number=(%Random% %% %_count%)+1 
10.
 
11.
:chose 
12.
for /f "tokens=1* delims=:" %%g in ('dir /b "%Pool%\WallpapersPool\*.jpg" 2^>nul^|findstr /n "^" ^|findstr /b "%Number%:"') do set "fname=%%h" 
13.
 
14.
:change 
15.
echo %fname% 
16.
copy "%Pool%\WallpapersPool\%fname%" "%Pool%\WallpaperActive\Background.jpg" >nul 
17.
move "%Pool%\WallpapersPool\%fname%" "%Pool%\WallpapersUsed\"
Bitte warten ..
Mitglied: bastla
26.01.2011 um 21:11 Uhr
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
Bitte warten ..
Mitglied: Biber
26.01.2011 um 21:16 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (11)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (17)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...