functionstrut
Goto Top

Powershell Scriptblock funktioniert nicht mehr?!

Hallo,

ich habe eben durch zufall festgestellt das bei mir seit 6 Tagen ein stück in meinen Powershell scripten nicht mehr funktioniert. und zwar habe ich am Anfang eines Scriptes immer:

$aktuelle_stunde_tag_jahr = {$aktuellestunde = (Get-Date).Hour
$aktuellertag = (Get-Date).Day
$aktuellermonat = (Get-Date).Month
$aktuellesjahr = (Get-Date).Year}
um dann später an diversen stellen im Script mit
&$aktuelle_stunde_tag_jahr
die aktuellen zeiten in die jeweiligen variablen zu bekommen und dann für vergleiche etc. verwende. mir ist schon klar das es sicherlich eine bessere lösung gibt aber es hat funktioniert und das war für mich erstmal das wichtigste.

bisher war der Output (wenn angefordert durch die variablen) dann immer folgender:
10
6
6
2019
(anhand des heutigen Tages)

seit ein paar tagen funktioniert das ganze aber nicht mehr, warum auch immer. Das Datum wird nicht mehr in die Variable eingetragen.

Kann mir einer helfen?

Danke schonmal im voraus face-smile

Content-Key: 459120

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

Printed on: April 23, 2024 at 15:04 o'clock

Mitglied: 139920
Solution 139920 Jun 06, 2019 updated at 08:41:25 (UTC)
Goto Top
das ganze aber nicht mehr, warum auch immer. Das Datum wird nicht mehr in die Variable eingetragen.
&$aktuelle_stunde_tag_jahr
Stichwort Dot-Sourcing, ein & oder ein . (Punkt) macht beim Einbinden von Scriptblocks und Funktionen beim Variable-Scope einen großen Unterschied:
https://devblogs.microsoft.com/scripting/how-to-reuse-windows-powershell ...
http://joinpowershell.de/de/2017/01/16/powershell-was-und-warum-dot-sou ...
Btw. du kannst Werte aus Skriptblocks auch per return zurückgeben, genau so wie bei Funktionen face-wink.

Würde ich dir als Lektüre mal empfehlen:
About Scopes
Member: functionstrut
functionstrut Jun 06, 2019 at 09:48:33 (UTC)
Goto Top
Hallo danke für deine Antwort. Das sieht sehr komplex aus das Thema :-o

Die Frage ist doch wieso auf einmal mein Codeschnipsel nicht mehr funktioniert? Ich will einfach nur das bestimmte variablen durch einen Befehl wieder neu zugewiesen werden ohne den gesamten Code immer wieder mit in das gesamte Script packen zu müssen.
Mitglied: 139920
Solution 139920 Jun 06, 2019 updated at 13:17:13 (UTC)
Goto Top
Das sieht sehr komplex aus das Thema :-o
Nö, man muss es nur einmal lesen und verstehen.
Nehm den Punkt zum Aufrufen, dann nimmst du die Variablen des Skriptblocks mit in die aktuelle Session.
Mit dem & Führst du den Skriptblock in einem anderen Kontext aus und deswegen sind die Variablen nicht im aktuellen Kontext sichtbar.

An diesem Beispiel siehst du warum
https://tio.run/##K8gvTy0qzkjNyfn/X6UktbhEwVahmktBpSyxCMhKTy3RTUksSeWq5V ...

$test = {
 $var = get-date
}
& $test
write-host "Test ausgeführt mit & Var = $var"  
. $test
write-host "Test ausgeführt mit . Var = $var"  
In der ersten Ausgabe ist die Variable leer weil durch & aufgerufen die Variable nur im Skriptblock existiert (Ja, ein Skriptblock ist in dem Sinne eine eigene Umgebung!). Nach dem zweiten Aufruf mit Punkt holst du die Variablen des Skriptblocks mit in die aktuelle Session und die Variablen sind dort auch gefüllt.
Member: functionstrut
functionstrut Jun 06, 2019 at 13:53:48 (UTC)
Goto Top
tatsache face-surprise
habe die & in punkte geändert und nun funktioniert es einwandfrei. Ich verstehe noch immer nicht wieso es MONATE lang so funktionierte und dann auf einmal nicht. Des letzte Windowsupdate(Server) ist schon 3-4 Wochen her und dieses Problem hier besteht/bestand erst seit ein paar tagen.

Danke für die Ausführliche Erklärung, jetzt habe ich es auch verstanden face-smile
Mitglied: 139920
139920 Jun 06, 2019 updated at 14:14:18 (UTC)
Goto Top
Ich verstehe noch immer nicht wieso es MONATE lang so funktionierte und dann auf einmal nicht.
Wir kennen deine Skripte ja nicht. Fakt ist das es so niemals funktioniert haben kann zumindest nicht so wie es oben steht.
Wie gesagt, les dir mal den Abschnitt about_scopes durch. Denke da liegt dein Fehler begraben, das missachten viele Powershell-Anfänger leider obwohl dieser Artikel absolutes Pflichtprogramm für jeden Powersheller sein sollte. Außerdem Variablendeklaration durch $script:var und $global:var solltest du dir mal ansehen.

Btw. das jedes mal in den Kopf jedes Skriptes zu schreiben ist auch nicht gerade effizient face-smile. Dafür gibt's Module und Profildateien.
Member: functionstrut
functionstrut Jun 06, 2019 at 20:38:01 (UTC)
Goto Top
Ich lege meine hand dafür ins feuer das ich an dem Script wirklich nichts geändert hatte, es lief wirklich so wie oben beschrieben. Ist aber auch egal. Ich habe nun alle & mit . Ausgetauscht und es läuft wieder.
Ich habe mir deine Denkansätze Mal auf meine ToDo Liste notiert und werde sie dann bei Gelegenheit in Angriff nehmen. Mir ist bewusst das man wiederkehrende Sachen auch zentral aus einer Datei laden kann etc. Aber im Moment geht es mir erstmal darum alles was ich zu automatisieren habe, zum laufen zu bekommen und die Optimierung/Bastelarbeit kommt dann Stück für Stück face-smile