Jump to content

Powershell-Script - Wechsel Desktophintergrund nach Datum


Direkt zur Lösung Gelöst von daabm,

Empfohlene Beiträge

Hallo Zusammen,

Ich bin neu hier. Ich habe versucht, per Powershell-Script den Desktophintergrund - datumsbezogen zu ändern.

Meine Kalenderbilder liegen im Verzeichnis "C:\Daten\Kalender\Monatsbilder\" - im jpg-Format.

Dort soll nach Monat und Jahr gesucht werden. Im Dezember auch nach Tag, damit die Bilder des Adventkranzes der entsprechenden Woche zugeordnet werden.

 

Das Script funktioniert bis zur Zeile 40. Am Ende des Scripts wird in der richtige Befehl auf dem Bildschirm ausgegeben, aber die Kopie des Bildes nicht in das vorgesehene Verzeichnis kopiert. Wenn ich den Befehl kopiere und manuell ausführe funktioniert das Kopieren. Was mache ich falsch?

Für Hilfe wäre ich dankbar.

 

Hier das Script

 

#Hintergrundbild nach Datum tauschen - Powershell 10.12.2024 wegu

RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True

$a = "Copy-Item"
$b = " C:\Daten\Kalender\Monatsbilder\"
$c = Get-Date -Format "MM_yyyy"
$cm = Get-Date -Format "MM"
$cd = Get-Date -Format "dd"

#Für Advent 4 Bilder vorbereiten
$cmdez = 12
$adv1 = "_1"
$adv2 = "_2"
$adv3 = "_3"
$adv4 = "_4"
$edat1 = "7"
$edat2 = "14"
$edat3 = "21"
$edat4 = "25"

$d =  ".jpg"
$e = " -Destination C:\Daten\Kalender\aktuell.jpg"
$f = "C:\Daten\Kalender\aktuell.jpg"

#Remove-item C:\Daten\Kalender\aktuell.jpg

#neues Hintergrungdild erzeugen
If (($cm -ne $cmdez))
    {-join($a,$b,$c,$d,$e)} 

#Adventbilder 1-4
If (($cm -eq $cmdez) -and ($edat1 -lt $cd))
    {-join($a,$b,$c,$adv1,$d,$e)}
If (($cm -eq $cmdez) -and ($cd -gt $edat1) -and ($cd -lt $edat2))
    {-join($a,$b,$c,$adv2,$d,$e)}
If (($cm -eq $cmdez) -and ($cd -gt $edat2) -and ($cd -lt $edat3))
    {-join($a,$b,$c,$adv3,$d,$e)}    
If (($cm -eq $cmdez) -and ($cd -gt $edat3) -and ($cd -lt $edat4))
    {-join($a,$b,$c,$adv4,$d,$e)} 

#Die Auswahl funktioniert, aber Erstellung der Bildkopie im Ordner C:\Daten\Kalender erfolgt nicht. 
#Der String der für die Erstellung notwendig ist, wird korrekt im unteren Fenster angezeigt,
#kann kopiert und ausgeführt werden. Dann wird der Desktophintergrund gewechselt.

#Wechsel des Desktopbilds
$code = @' 
using System.Runtime.InteropServices; 
namespace Win32{ 
    
     public class Wallpaper{ 
        [DllImport("user32.dll", CharSet=CharSet.Auto)] 
         static extern int SystemParametersInfo (int uAction , int uParam , string lpvParam , int fuWinIni) ; 
         
         public static void SetWallpaper(string thePath){ 
            SystemParametersInfo(20,0,thePath,3); 
         }
    }
 } 
'@

add-type $code 

#Bildhintergrund neu
[Win32.Wallpaper]::SetWallpaper($f)
 

 

 

Link zu diesem Kommentar

Deine Joins bauen einen String zusammen, keinen Befehl... Code kann man hier im Forum übrigens auch formatiert einfügen. Und wenn Du Deinen Variablen sprechende Namen gibst, verstehen Dritte schneller, was da überhaupt passiert.

 

If (($cm -eq $cmdez) -and ($edat1 -lt $cd))
    {-join($a,$b,$c,$adv1,$d,$e)}
If (($cm -eq $cmdez) -and ($cd -gt $edat1) -and ($cd -lt $edat2))
    {-join($a,$b,$c,$adv2,$d,$e)}
If (($cm -eq $cmdez) -and ($cd -gt $edat2) -and ($cd -lt $edat3))
    {-join($a,$b,$c,$adv3,$d,$e)}    
If (($cm -eq $cmdez) -and ($cd -gt $edat3) -and ($cd -lt $edat4))
    {-join($a,$b,$c,$adv4,$d,$e)} 

 

Im zweiten Schritt können wir uns dann über die Logik unterhalten, die die Dateinamen ermittelt :-)

Link zu diesem Kommentar

Hallo Martin @daabm,

Wie schon geschrieben, bin ich auf diesem Gebiet absoluter Neuling.

Ich habe vor langer Zeit lediglich xBase-Programme geschrieben. Nun hatte ich einfach Lust, mir die Powershell etwas anzuschauen. Da ich bereits Rentner bin, ist es für mich reine Neugierde wie das mit der Powershell funktioniert.

 

Mir war klar, dass ich mit dem join-Befehl Zeichenketten zusammenfüge. Was mir für dieses Projekt gefehlt hat, war die aktuelle Zeichenkette als Befehl auszuführen.

Der Sinn bis zur Zeile 40 ist nur die Zusammenstellung der Zeichenkette für das Kopieren des Monatsbildes bzw. des Wochenbild für den Dezember aus dem Verzeichnis C:\Daten\Kalender\Monatsbilder\, das Speichern im Verzeichnis C:\Daten\Kalender\aktuell.jpg. Ab der Zeile 46 steht der Code für den Wechsel des Desktophintergrunds.

 

Für die aktuelle Woche wird die folgende Zeichenkette zusammengestellt:

 

Copy-Item C:\Daten\Kalender\Monatsbilder\12_2024_3.jpg -Destination C:\Daten\Kalender\aktuell.jpg

 

Wenn ich diese Zeichenkette kopiere und im unteren blauen Fenster einfüge und mit Enter bestätige, wird der Befehl ausgeführt.

 

Man müsste daher, so denke ich, nur diese Zeichenkette in einen ausführbaren Befehl umwandeln.

 

Copy-Item  -#wäre der auszuführende Befehl

C:\Daten\Kalender\Monatsbilder\12_2024_3.jpg - #ist der Pfad und das für diese Woche ausgewählte Bild

-Destination C:\Daten\Kalender\aktuell.jpg - #wäre das Zielverzeichnis und der Name des Bildes.

 

Diesen String habe ich auch in die Variable $f gelegt und wird in der Zeile 65 für den Wechsel des Wallpapers verwendet.

 

Schönen Nachmittag

Günter

 

 

 

Link zu diesem Kommentar
  • Beste Lösung

Servus Günter. Ok, Du bist offen und bereit zu lernen, schon mal gute Voraussetzungen :-)

 

Du willst ja immer Copy-Item ausführen, eigentlich auch immer mit den gleichen Parametern, die nur unterschiedliche Inhalte haben, da wäre Splatting die einfachste Variante. Ganz grob:
 

$Params = @{
    Path = $SourceFile
    Destination = $TargetFolder
}
Copy-Item @Params

 

Den Inhalt von $Params baust Du Dir in Deiner If-Rutsche dann jeweils unterschiedlich zusammen. Geht übrigens auch "gesplittet":
 

$Params = @{
    Path = $SourceFile
}
Copy-Item @Params -Destination $TargetFolder

 

Man "könnte" deinen aktuellen String auch an Invoke-Expression verfüttern, aber das ist "bad bad style" :-)

 

Und ansonsten zerlegst Du am Anfang alle Eigenschaften von DateTime-Objekten in Strings, um die dann mühsam wieder miteinander zu vergleichen. Das geht wesentlich einfacher, aber da hab ich grad keinen Kopf dafür, muss gleich erst mal so was "Nebensächliches" wie Abendessen machen :-)

Link zu diesem Kommentar

Hallo Martin @daabm,

Ich habe das jetzt getestet. Es funktioniert.

Danke nochmals für Deine Hilfe.

 

P.S.:

Mangels besserem Wissen, habe ich die If-Abfrage so umgebaut

 

#neues Monats-Hintergrungdild erzeugen - Ausnahme Dezember (Adventkranz mit erleuchteten Kerzen)
If (($cm -ne $cmdez))
    {$SourceFile = -join($b,$cm,"_",$cj,$d)} 

#Adventbilder 1-4
If (($cm -eq $cmdez) -and ($edat1 -lt $cd))
    {$SourceFile = -join($b,$cm,"_",$cj,$adv1,$d)}
If (($cm -eq $cmdez) -and ($cd -gt $edat1) -and ($cd -lt $edat2))
    {$SourceFile = -join($b,$cm,"_",$cj,$adv2,$d)}
If (($cm -eq $cmdez) -and ($cd -gt $edat2) -and ($cd -lt $edat3))
    {$SourceFile = -join($b,$cm,"_",$cj,$adv3,$d)}    
If (($cm -eq $cmdez) -and ($cd -gt $edat3) -and ($cd -lt $edat4))
    {$SourceFile = -join($b,$cm,"_",$cj,$adv4,$d)}

Link zu diesem Kommentar
vor 23 Stunden schrieb wegu1:

Danke dafür, dass Du Dich meines - eigentlich unwichtigen - Problems annimmst.

 

Ein kleiner Ausflug in die Filosofie: Es gibt keine unwichtigen Probleme, wenn es Probleme anderer sind. Niemand hat das umfassende Hintergrundwissen, die Relevanz von Problemen anderer für ebendiese Anderen zu beurteilen :-)

 

Und wenn Du weitermachen willst: Beschäftige Dich mit Splatting (der Krempel mit dem $Parms=@{} und @Parms) und mit den unendlichen Möglichkeiten von DateTime-Objekten.

Link zu diesem Kommentar

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...