2016-05-10 22 views
0

Mein DSC-Skript setzt JAVA_HOME über ein benutzerdefiniertes Modul nach erfolgreicher JAVA-Installation.Aktualisieren der Umgebungsvariable mit Powershell-DSC {funktioniert nicht}!

ich dann versuchen, die aktualisierte JAVA Hause mit der folgenden Zeile in einem Skript-Ressource abzurufen -

SetScript = "[Environment]::SetEnvironmentVariable('JAVA_HOME',[System.Environment]::GetEnvironmentVariable('JAVA_HOME','Machine'))" 

ich das ausführliche Protokoll der Ressource ausgeführt wird, die besagt, sehen kann. Nachdem das Skript beendet ist, hält meine Konsole jedoch weiterhin an dem vorherigen JAVA_HOME fest.

Das Problem, das ich damit habe, ist mein Skript (weiter unten) muss eine Batchdatei aufrufen, die JAVA_HOME verwendet, aber weil die Sitzung den falschen Wert übergibt es mit fehlschlägt "System kann den angegebenen Pfad nicht finden ".

Kann jemand bitte mit einer Lösung helfen, dieses Problem zu überwinden?

Haftungsausschluss: Ich bin sehr sehr neu in Powershell. Bitte erläutern Sie es ausführlich.

+0

Sie sagen, 'weiter unten' Ihr Skript fehlschlägt.Es wäre gut, wenn Sie das vollständige Skript einschließlich der Einstellung der Umgebung und wo Sie es verwenden. Mit unvollständiger Repro kann ich Ihnen nur sagen, wie es funktioniert und hoffentlich können Sie herausfinden, wie es zu beheben ist. – TravisEz13

Antwort

0

SetEvironmentVariable setzt die Variable für den Prozess in es läuft (standardmäßig kann es auch für die Maschine oder Benutzer.) DSC-Skripte als separater Prozess als Systemkonto ausgeführt werden ausführen und aktualisieren kann nicht Ihre Konsole . Es erscheint basierend auf dem Skript, das bereits auf der Maschinenebene aktualisiert wurde. Um die Variable in Ihrer Konsole holen Sie eines von zwei Dingen tun müssen:

  • Starten Sie eine neue Konsole die Schale
  • Aktualisieren Sie die Variable (Wie Sie im DSC-Code oben hat) aus der Maschinenumgebung.
1

Der folgende Code zeigt, wie Sie dies tun könnte:

configuration envtest 
{ 
    Script s1 
    { 
     GetScript = { 

     } 
     SetScript = { 
      $ENV:FOOBAR > c:\temp\env.txt 
     } 
     TestScript = { 
      [environment]::SetEnvironmentVariable("FOOBAR", "hi there", "MACHINE") 
      $ENV:FOOBAR = [environment]::GetEnvironmentVariable("FOOBAR", "MACHINE") 
      $false 
     } 
    } 

    Script s2 
    { 
     GetScript = { } 
     TestScript = { $false } 
     SetScript = { $ENV:FOOBAR > c:\temp\env2.txt } 
     DependsOn = "[script]s1" 
    } 
} 

envtest 
Start-DscConfiguration -force -Wait -Verbose -Path envtest 

Beachten Sie, dass sich in der DSC-Skript

jedoch durch gelaicht Prozesse nur Skriptressourcen Vorteil einer Laufzeitänderung wie eine neue ENV Variable annehmen kann Das Skript wird die neue Variable aufnehmen, solange die Skript-Ressource zuerst ausgeführt wird.

Auch wenn die ISE Ihnen sagen wird, dass die Skript-Ressource eine Zeichenfolge benötigt, empfehlen wir, einen Skriptblock anstelle einer Zeichenfolge zu verwenden - dies ist einfacher und führt zu weniger Zitationsfehlern. Wenn Sie ein Skript benötigen, um den Wert einer Kompilierzeitvariablen zu erfassen, verwenden Sie $ using: myCompileTimeVariable anstelle von $ myCompileTimeVariable und alles sollte einfach funktionieren.

+0

Ja, Bruce, das ist ein schöner kleiner Trick, wenn du etwas installiert hast, das deinen Pfad aktualisiert hat. DSC wird es nicht vom Pfad abholen (bis das cmcm neu gestartet wird?), Aber das erneute Laden des Pfades funktioniert ein Vergnügen! $ ENV: Pfad = [Umgebung] :: GetEnvironmentVariable ("PFAD", "MASCHINE") –

0

Als eine sauberere Alternative gibt es eine DSC-Ressource für Umgebung. Von ihrem Code in GitHub scheint es auch [Umgebung] :: GetEnvironmentVariable ("FOOBAR", "MASCHINE") Teil, wenn Sie es versuchen möchten.

Environment [string] #ResourceName 
{ 
    Name = [string] 
    [ Ensure = [string] { Absent | Present } ] 
    [ Path = [bool] ] 
    [ DependsOn = [string[]] ] 
    [ Value = [string] ] 
} 

Referenz: https://docs.microsoft.com/en-us/powershell/dsc/environmentresource

Code: @line 647

https://github.com/PowerShell/PSDscResources/blob/2c33e69634aa9c641ab27427d457fe9f49884e7c/DscResources/MSFT_EnvironmentResource/MSFT_EnvironmentResource.psm1#L647

Verwandte Themen