wegu1 0 Geschrieben 16. Dezember Melden Teilen Geschrieben 16. Dezember 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) Zitieren Link zu diesem Kommentar
daabm 1.366 Geschrieben 17. Dezember Melden Teilen Geschrieben 17. Dezember 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 1 Zitieren Link zu diesem Kommentar
wegu1 0 Geschrieben 17. Dezember Autor Melden Teilen Geschrieben 17. Dezember 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 Zitieren Link zu diesem Kommentar
Beste Lösung daabm 1.366 Geschrieben 17. Dezember Beste Lösung Melden Teilen Geschrieben 17. Dezember 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 1 Zitieren Link zu diesem Kommentar
wegu1 0 Geschrieben Dienstag um 19:14 Autor Melden Teilen Geschrieben Dienstag um 19:14 Hallo Martin @daabm, Danke dafür, dass Du Dich meines - eigentlich unwichtigen - Problems annimmst. Mir macht es Spaß auch nach 30 Jahren in der IT noch neues zu lernen. Ich werde mit Deinen Ansätzen ein bisschen experimentieren. Deine "Nebensächlichkeit" finde ich äußerst wichtig. Ich koche und esse auch gern. Schönen Abend Günter Zitieren Link zu diesem Kommentar
wegu1 0 Geschrieben Mittwoch um 08:05 Autor Melden Teilen Geschrieben Mittwoch um 08:05 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)} Zitieren Link zu diesem Kommentar
NorbertFe 2.062 Geschrieben Mittwoch um 08:51 Melden Teilen Geschrieben Mittwoch um 08:51 vor 19 Stunden schrieb daabm: Code kann man hier im Forum übrigens auch formatiert einfügen Dann liest sich das besser. Zitieren Link zu diesem Kommentar
daabm 1.366 Geschrieben Mittwoch um 19:08 Melden Teilen Geschrieben Mittwoch um 19:08 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. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.