bankaifan
Goto Top

Kleiner Batch Wallpaper-Changer

Hallo zusammen,

hier werde ich euch meinen Wallpaper-Changer vorstellen.

Gleich vorab, wer Verbesserungsvorschläge kann diese gerne äußern.

Ziel des Programms ist es, den Desktophintergrund in bestimmten Abständen zu wechseln.


Benötigte Dateien:

- anz.txt
- Rename.bat
- Exit_Wallpaper.bat
- Invisible_Wallpaper.vbs
- Start_Wallpaper.bat
- wallpaper.bat


Zu allererst müssen wir die Bilddateien anpassen.

WICHTIG: Alle Bilddateien müssen im .bmp Format sein.

Hierzu verwenden wir die Datei "Rename.bat" mit diesem Code:

@echo off & setlocal enabledelayedexpansion
set /P "anzi="<"anz.txt"  
set result=10000
if exist anz.txt set result=10%anzi%
if not exist %CD%\original mkdir %CD%\original
if not exist %CD%\autodsk mkdir %CD%\autodsk
for /f "delims=" %%i in ('dir /b *.bmp') do (   
set /a result+=1
copy "%CD%\%%i" "%CD%\autodsk\%%i"  
ren "%CD%\autodsk\%%i" !result:~-4!.bmp  
if exist "%CD%\original\%%i" ren "%CD%\%%i" "%%~ni(!result:~-4!).bmp" | move /Y "%%~ni(!result:~-4!).bmp" "%CD%\original\"  
if exist "%CD%\%%i" move /Y "%CD%\%%i" "%CD%\original\"  
if exist "%CD%\%%~ni.jpg" del "%CD%\%%~ni.jpg"  
if exist "%CD%\%%~ni.png" del "%CD%\%%~ni.png"  
)
cls
echo.
echo Alle Dateien wurden erfolgreich modifiziert.
pause >nul

Zur Erklärung:

Die Datei anz.txt enthält die Anzahl der schon angepassten existierenden Bilddateien.
Anschließend wird die Variable "result" auf die maximalen Stellen der Bilddateien gesetzt hier, 10000. (Entspricht maximal 9999 Bilddateien)
Nun wir geprüft ob die Datei "anz.txt" existiert und anschließend wird aktuelle Anzahl der existierenden Bilder in "result" gespeichert.
Dann werden die Ordner "original" und "autodsk" erstellt
Jetzt werden alle Dateien im .bmp Format in den Ordner "autodsk" kopiert und umbenannt.
Die alten Dateien werden in den Ordner "original" kopiert.


Jetzt da wir die Bilddateien im richtigen Format haben und auch per Zufall die Bilder auswählen müssen wir sie nurnoch als Bildschirmhintergrund setzen.

Dazu nehmen wir die "wallpaper.bat" her:

@echo on & setlocal enabledelayedexpansion
title #Auto Wallpaper#
set "Input=%temp%\Input.vbs"   
REM ========================================================================================
REM Abfragen der Zeitabstände
echo WScript.Echo InputBox("Bitte gib die Abstände in Sekunden an.","Zeitabstände")>%Input%   
set break= 
for /f "delims=" %%i in ('cscript //nologo %Input%') do set "break=%%i"   
if break GTR 0 (
set break=60
)
pause >nul
set anz=0
for /f "delims=" %%i in ('dir /b autodsk\*.bmp') do (   
set /a anz+=1
)
echo %anz% > anz.txt
:start
set wallpath=Y:\Wallpaper\Wallpaper\HD\HD\autodsk
:quiet
REM ========================================================================================
REM Erzeugen einer Zufallszahl
:: set /a rand=10001 + %random% %% anz
call Random.js
set /p "rand="<"%CD%\test.txt"  
REM ========================================================================================
REM Wallpaper wird configuriert
REG ADD "HKCU\Control Panel\Desktop" /V Wallpaper /T REG_SZ /F /D "%wallpath%\%rand%.bmp"  
REG ADD "HKCU\Control Panel\Desktop" /V WallpaperStyle /T REG_SZ /F /D 0  
REG ADD "HKCU\Control Panel\Desktop" /V TileWallpaper /T REG_SZ /F /D 0  
REM ========================================================================================
REM Aktualisieren des Userprofils
%SystemRoot%\System32\RUNDLL32.EXE user32.dll, UpdatePerUserSystemParameters
REM ============================================================================================
REM Aufrufen von BgInfo
::cd "Y:\Settings" 
::H:\Allgemein\Software\BgInfo\BgInfo.exe Y:\Settings\BGInfo.bgi /timer:0
REM ============================================================================================
REM Warten bis zum nächsten Wechsel
sleep %break%
goto :start

Hier wird zuerst per Popup der Zeitabstand zwischen den Wechseln abgefragt.
Anschließend wird die Anzahl der existierenden Bilder in die "anz.txt" gespeichert.
Nun werden die Registryeinträge angepasst und schließlich das Userprofil aktualisiert


TileWallpaper: Ersetzen wir die 0 durch eine 1 werden die bilder im Format "Nebeneinander" angezeigt.

WallpaperStyle: Ersetzen wir die 0 durch eine 2 werden die Bilder "gestreckt" angezeigt.


Jetzt würde das ganze schon funktioieren. Also können wir uns um ein paar Feinheiten kümmern:

Die Datei "Start_Wallpaper.bat" startet lediglich ein anderes script, kann aber für weitere Zwecke z. B. andere Programme beim Autostart starten verwendet werden.

@echo off
echo Wallpaperwechsel wird gestartet...
start RunABatMinimized.vbs wallpaper.bat
echo Wallpaperwechsel wurde gestaret...
exit


Nun müssen wir diese Datei "Invisible_Wall.vbs" bearbeiten

'---Snipp RunABatMinimized.vbs  
Set WshShell = WScript.CreateObject("WScript.Shell")   
Return = WshShell.Run("wallpaper.bat", 0, True)   
Set WshShell = Nothing 
'---Snapp RunABatMinimized.vbs  

Diese Bewirkt, dass alle Scripte unsichtbar ausgeführt werden d. H. sie können nur beendet werden, wenn man den prozess "cmd.exe" im Taskmanager beendet.


Um das zu vereinfachen werden hier einfach alle "cmd.exe" Prozesse beendet

Exit_Wallpaper.bat:

@echo off
echo Alle cmd-Prozesse werden beendet...
taskkill /F /FI "WINDOWTITEL eq #Auto Wallpaper#"  
echo Alle Prozesse beendet...


Das wars soweit. Wenn noch jmd weitere Ideen oder Verbesserungsvorschläge hat, her damit.

Ansonsten viel Spaß beim testen.

Das Tool und die Anleitung ist Eigentum von ©WireWare
Kommentar vom Moderator Biber am 30.07.2010 um 16:06:13 Uhr
Zitat von @bankaifan:
Benötigte Dateien:

- anz.txt
- Dateien umbennen.bat
- Exit_Wallpaper.bat
Set /a rgc+=1
#694

Content-ID: 148015

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

Ausgedruckt am: 05.11.2024 um 15:11 Uhr

bastla
bastla 30.07.2010 um 15:09:56 Uhr
Goto Top
Hallo bankaifan!

Nur kurz zu einem Teilaspekt: Wenn es nicht Dein Ziel ist, möglichst viele Sprachen in möglichst vielen Dateien zu verwenden, könntest Du zB mit
set /a rand=10001 + %random% %% anz
und danach der Verwendung als
... "%wallpath%\%rand:~-4%.bmp" ...
einiges einsparen ...

Grüße
bastla
bankaifan
bankaifan 30.07.2010 um 15:23:11 Uhr
Goto Top
Hi Bastla,

also ich das Programm geschrieben habe, wusst ich noch nicht, dass man mit Batch Zufallszahlen erzeugen kann.

Aber zu deinem Codestück

set /a rand=10001 + %random% %% anz

zwei kleine Fragen.

1. Erzeugt man eine zufallszahl nicht mit !random! und
2. was hat das
%% anz
zu bedeuten.

Gleich mal noch ne Frage, weiß jmd wie ich bei dem VBS-Script anstellen von "DEINVERZEICHNIS" gleich das aktuelle Verzeichnis als Variable nutzen kann?


EDIT: Es funktioniert auf jedenfall perfekt, danke dir :D
Biber
Biber 30.07.2010 um 15:50:22 Uhr
Goto Top
Moin bankaifan,

zu deinen Fragen:
  • das " %% anz " in der SET /A-Anweisung ist die Batchversion des CMD-Prompt-Operators "%" == Modulo == ganzzahliger Rest

Am Cmd-Prompt ergibt "Set /a 21317 % 4" den Wert 1 .-->denn 21317 geteilt durch 4 ist kA Rest 1
Im Batch muss dieses "%"-Prozentzeichen verdoppelt werden.

Und die !var!-Schreibweise brauchst du nur, wenn du innerhalb eine FOR- (oder meinetwegen auch IF()-) Anweisung eine Variable bei jedem neuen Schleifendurchlauf nochmal neu auflösen willst.

Demo von beidem am CMD-Prompt
(=15:44:44  D:\temp=)
>set "oldprompt=%prompt%" & set "prompt=$g$h" & set /a anz=66
66
for /L %i in (1,1,5) do set /a rand=10001 + %random% % %anz%

set /a rand=10001 + 2397 % 66
10022
set /a rand=10001 + 2397 % 66
10022
set /a rand=10001 + 2397 % 66
10022
set /a rand=10001 + 2397 % 66
10022
set /a rand=10001 + 2397 % 66
10022
for /L %i in (1,1,5) do set /a rand=10001 + !random! % %anz%

set /a rand=10001 + !random! % 66
10018
set /a rand=10001 + !random! % 66
10063
set /a rand=10001 + !random! % 66
10005
set /a rand=10001 + !random! % 66
10065
set /a rand=10001 + !random! % 66
10014
set prompt=%oldprompt%

(=15:44:59  D:\temp=)
Die Promptänderung hat nichts mit der Sache zu tun, ist nur, damit es nicht so viele Zeilen werden.
Im ersten Fall bleibt der Wert von %random% immer derselbe (einmalig aufgelöst ==> führt immer zu Ergebnis 10022
Im zweiten Fall mit !random! wird es bei jedem FOR-Durchlauf neu aufgelöst => unterschiedliche Werte.

Grüße
Biber
bankaifan
bankaifan 30.07.2010 um 15:55:47 Uhr
Goto Top
Supi. Ging garnicht verständlicher :D

Danke dir
bastla
bastla 30.07.2010 um 15:58:24 Uhr
Goto Top
Hallo bankaifan!
1. Erzeugt man eine zufallszahl nicht mit !random!
Wenn sie zB innerhalb einer "for"-Schleife gleich benötigt wird und deshalb "delayedExpansion" aktiv ist: ja; ansonsten ist %random% einfach eine (Pseudo-)Systemvariable.

zu 2.
Mit %% (in einem Batch, sonst nur %) wird eine Modulo-Division vorgenommen - das Ergebnis liegt daher immer im Bereich 0 bis %anz%-1. Nach als Anmerkung: Da in einer "set /a"-Anweisung (siehe Hilfe) "alle nicht-nummerischen Zeichenfolgen im Ausdruck als Zeichenfolgen von Umgebungsvariablen behandelt" werden, müssen die ansonsten erforderlichen %-Zeichen nicht geschrieben werden ...
wie ich bei dem VBS-Script anstellen von "DEINVERZEICHNIS" gleich das aktuelle Verzeichnis als Variable nutzen kann?
Indem Du gar keinen Pfad angibst ...

Falls allerdings eine Entsprechung zu "%~dp0" in einem Batch gemeint wäre, dann:
ScriptDir = Replace(WScript.ScriptFullName, WScript.ScriptName, "")
Grüße
bastla

[Edit] @Biber: Am Freitagnachmittag noch so schnell? face-wink [/Edit]
bankaifan
bankaifan 30.07.2010 um 16:07:17 Uhr
Goto Top
Danke euch

Hab noch ne kleine Verständnisfrage:

set %zufall%=90
for /L %%i in (0,1,300) do (
set /a zahl=%%i
set /a rand=10001 + %zufall% %% zahl 
echo %rand%
pause >nul
)

Da bekomm ich von %rand% keine Ausgabe. Warum?
60730
60730 30.07.2010 um 16:08:06 Uhr
Goto Top
Zitat von @bastla:
[Edit] @Biber: Am Freitagnachmittag noch so schnell? face-wink [/Edit]
(OT) dafür war er gnädig und hat seinen Counter nicht angeworfen
Benötigte Dateien:
Dateien umbennen.bat
Hierzu verwenden wir die Datei "Dateien umbennen.bat" mit diesem Code:
(/OT)

@bankafin: Schee änders schneller um, als der Biber seinen Counter anwirft und "Danke" für die Mühe eine Anleitung zu machen.

Gruß
edit - schau nochmal - was die die beiden Bs unabhängig voneinander wegen !parameter! und %parameter% geschrieben haben - jetzt (schleifsche) ist %123% falsch. /edit
edit quarkt schon wieder - Bibers counter läuft . Tick Tick Tick../edit
bastla
bastla 30.07.2010 um 16:12:00 Uhr
Goto Top
Hallo bankaifan!
Da bekomm ich von %rand% keine Ausgabe. Warum?
Hat doch Biber oben erst für %random% erklärt ...

Grüße
bastla
Biber
Biber 30.07.2010 um 16:12:10 Uhr
Goto Top
Moin bankaifan,

dasselbe Thema wie oben... eine Variable, die innerhalb einer FOR-Anweisung jedesmal neu aufgelöst werden soll schreiben wir mit...? Na..??

@t-mo
Doch den rgc habe ich gerade aktualisiert, bevor ich deinen Kommentar gelesen habe.

@bastla ad Freitagnachmiitag: Ja, es geht aufwärts seit heute mittag.
Weil ich da das Gefühl hatte, der Montag wäre endlich fast vorbei.. [Edit] 18.09h Das war trügerisch face-sad [/Edit]

Schönes Wochenende
Biber
bastla
bastla 30.07.2010 um 22:54:50 Uhr
Goto Top
Hallo bankaifan!

Nach nochmaligem Überfliegen der Batchdateien/Scripts einige Ergänzungen (ohne Anspruch auf Vollständigkeit face-wink):

In Zeile 10 der "wallpaper.bat" weist Du der Variablen %Input% den Wert 60 zu - gemeint ist aber wohl eher %sleep%.
Die "sleep.exe", die Du in Zeile 33 startest, ist in der Übersicht der benötigten Dateien nicht aufgeführt (und ließe sich außerdem durch ein VBScript ersetzen).
Wenn Du schon den Fenstertitel "#Auto Wallpaper#" an das unsichtbare CMD-Fenster vergibst, bietet es sich doch an, auf das unelegante Killen aller "cmd.exe"-Prozesse zugunsten eines gezielten Beendens des entsprechenden Fensters zu verzichten:
taskkill /F /FI "WINDOWTITEL eq #Auto Wallpaper#"
Das Script "RunABatMinimized.vbs" wäre wesentlich flexibler, wenn es die zu startende Batchdatei als Aufrufparameter erhielte - auf das Nötigste reduziert sähe das Script dann etwa so aus:
WScript.CreateObject("WScript.Shell").Run(WScript.Arguments(0),0,True)
Aufgerufen würde dieses Script dann zB mit
start RunABatMinimized.vbs wallpaper.bat
(ggf jeweils mit voller Pfadangabe, also etwa "C:\Scripts\RunABatMinimized.vbs").
Schließlich noch zur "Dateien umbennen.bat" (nein, ich kommentiere den Namensbestandteil unmittelbar vor dem Punkt nicht face-wink):
Über die Sinnhaftigkeit des Ablaufs und der Datei "anz.txt" ließe sich ja ev diskutieren, aber die (inflationäre) Verwendung von %CD% bringt: genau nix (und ist damit noch viel weniger nötig als das in einem Batch für "move" überflüssige "/Y") ...

Grüße
bastla
Biber
Biber 31.07.2010 um 11:46:19 Uhr
Goto Top
...und auch noch ein kleiner Nachtrag von mir...

Zitat von @bankaifan:
Danke euch

Hab noch ne kleine Verständnisfrage:

 set %zufall%=90
 for /L %%i in (0,1,300) do (
 set /a zahl=%%i
 set /a rand=10001 + %zufall% %% zahl 
 echo %rand%
 pause >nul
 )
 

Da bekomm ich von %rand% keine Ausgabe. Warum?
Ein anderer Fehler ist die Zeile 1, in der eine Variable mit dem Namen "%zufall%" gesetzt wird, nicht eine Variable mit dem Namen "zufall", wie beabsichtigt.

Das sind unterschiedliche Variablen.
[Demo am CMD-Prompt; das ">" stellt den Prompt dar - NICHT mit eingeben]
> Set %zufall%=77
> set zufall=jhgvkgkj
> set %z & set z
%zufall%=77
zufall=jhgvkgkj

Der Vollständigkeit halber: Wenn eingegeben würde
Set Zufall = bla
--> dann würde eine Variable mit dem Namen "Zufall+Leerzeichen" gesetzt werden.

Grüße
Biber
bankaifan
bankaifan 02.08.2010 um 08:18:40 Uhr
Goto Top
Hehe. Danke euch allen erstmal für die Antworten.

Ich hab meinen PC am WE ausgelassen :D

dasselbe Thema wie oben... eine Variable, die innerhalb einer FOR-Anweisung jedesmal neu aufgelöst werden soll schreiben wir mit...? Na..??
Ich glaub jetzt hab ichs verstanden :D

taskkill /F /FI "WINDOWTITEL eq #Auto Wallpaper#"

Ist ganz praktisch, wusst ich ned

EDIT:

@bastla

Ich rufe doch oben garkeine sleep.exe auf. Ich greife auf die Variable sleep zu und die 60 oben ist für den Fall, dass man nichts eingibt, dann wird die Variable automatisch auf 60 gesetzt

EDIT:

Ich hab des ganze doch noch weng ändern müssen :D
bastla
bastla 02.08.2010 um 09:23:05 Uhr
Goto Top
Hallo bankaifan!
Ich rufe doch oben garkeine sleep.exe auf.
Deine Zeile 40
sleep %break%
ist aber nicht anders zu interpretieren, da "sleep" kein Standard-CMD-Befehl (und damit defaultmäßig vorhanden) ist, sondern zB aus den Resource Kit Tools stammt ...

Grüße
bastla
bankaifan
bankaifan 02.08.2010 um 16:15:03 Uhr
Goto Top
Ah. Ok. Danke dir. face-smile

Aber ist sleep nicht bei XP ohnehin automatisch installiert.
bastla
bastla 02.08.2010 um 16:28:37 Uhr
Goto Top
Hallo bankaifan!
Aber ist sleep nicht bei XP ohnehin automatisch installiert.
Nö ...

... lässt sich aber per VBS (aus einem Batch heraus) realisieren:
@echo off & setlocal

set "sleep=%temp%\Sleep.vbs"  
>%sleep% echo WScript.Sleep WScript.Arguments(0)*1000

set /a break=10

echo (%time:~,8%) Weiter geht's in etwas mehr als %break% Sekunden ...  
%sleep% %break%
echo\
echo ... und zwar jetzt (%time:~,8%)
echo,
pause
Grüße
bastla

P.S.: Leerzeilen immer nur mit "echo." zu erzeugen ist öde ... face-wink
Biber
Biber 02.08.2010 um 17:31:38 Uhr
Goto Top
Na gut,

wenn wir jetzt ohnehin den Weg von einer "Anleitung" über Ästchen und Zweigchen zum allgemeinen Chatten eingeschlagen haben... face-wink

Dann hab ich auch noch einen.

Sinnvollerweise sollter der Benutzer, die die handgeschrotete... äh... hausgemachte sleep.vbs regelmäßig benutzt in seinen Bätchereien noch einmal im (User-)Leben dafür sorgen, dass das "Logo" (so nennen die PraktikantInnen die zweieinhalb Zeilen Prosa bei *.vbs-Aufruf) dauerhaft NICHT gezeigt wird.

Dafür einmalig bei einer Tasse Kaffee oder wann immer es passt eingeben
cscript //nologo /s
-- oder gar --
cscript //H:cscript  //nologo /s
-- oder, für ganz Perverse --
Wscript //nologo /s 
-- selbst das ist erlaubt und wird honoriert.

@bankaifan: Hilfe zu allen Befehlen am CMD-Prompt gibt es mit... kennst du ja.

Grüße
Biber
bastla
bastla 02.08.2010 um 17:52:42 Uhr
Goto Top
@Biber
D'accord - wobei aber gerade im Fall der obigen "Sleep.vbs" der (defaultmäßige) Aufruf über "WScript" genügt ...

Grüße
bastla
Biber
Biber 02.08.2010 um 18:07:17 Uhr
Goto Top
Moin bastla,

ja nee, manchmal geht es auch schief, wenn alle alles richtig machen.... face-wink

An einem meiner Rechner (an dem ich deinen Schnipsel angetestet habe) hatte ich offensichtlich schon mal eingegeben:
 cScript //h:cScript /s
Okay.... ich wollte damit dem Rechner sagen: "Hey, ich will alle *.vbs'se nur mit cScript.exe ausführen, reicht mir."

Hat der doofe Rechner auch brav gemacht... auch bei Aufruf der Sleep.vbs von oben.
Wollte ich ja so. Und Rechner sind halt so konzipiert.

Aber er hat natürlich das zweieinhalb-Zeilen-Logo angezeigt... as designed

Ich geb dir Recht - es wäre besser gewesen, wenn ich vorher gar nichts definiert hätte.
Beim Default-Host "WScript.exe" wäre KEIN Logo hochgepoppt.

Grüße
Biber
bastla
bastla 02.08.2010 um 18:15:26 Uhr
Goto Top
@Biber
Ich hatte zwar daran gedacht, aber die Zeile
%sleep% %break%
gefiel mir einfach besser als die "Sicherheitsvarianten"
wscript %sleep% %break%
oder
%sleep% %break%>nul
Grüße
bastla
bankaifan
bankaifan 03.08.2010 um 08:59:54 Uhr
Goto Top
@Biber Ich kann hier leider keinen CMD-Prompt aufrufen face-smile
@bastla versteh ich das richtig, dass ich quasi anstelle meine sleep befehls dein script aufrufen soll?
Biber
Biber 03.08.2010 um 09:18:56 Uhr
Goto Top
Moin bankaifan,

Zitat von @bankaifan:
@Biber Ich kann hier leider keinen CMD-Prompt aufrufen face-smile
Ja wie jezz'.... und ein
"Start"->"Ausführen" ->CScript //H:Cscript //nologo /s   
ist euch auch während der Fastenzeit verboten?

@bastla versteh ich das richtig, dass ich quasi anstelle meine sleep befehls dein script aufrufen soll?
bastla würde hier niemals etwas so hart formulieren - er gibt bestenfalls Anregungen.
Was im Alten Testament Senfkörner auf Beton streuen oder so ähnlich hiess.

Nochmal:
a) sleep.exe ist ab Windows-Werk NICHT dabei
b) wenn nur du diesen Batch brauchst und eine hast, dann is' doch gut
c) wenn ein soziales Randgruppenmitglied aber keine sleep.exe bei eBay ersteigert hat und dennoch mal Bubu machen will,
dann könnte er/sie die sleep.vbs nachschroten.

Grüße
Biber
bankaifan
bankaifan 03.08.2010 um 09:26:39 Uhr
Goto Top
Ah :D

Und nein, geht nicht. Ich kann nur ein Batch-Script schreiben. Und ein sleep /? > safe.txt geht auch nur bei vereinzelten befehlen weil die Hilfe bei einzellnen Befehlen ganz ausgeschaltet ist.