itsa 1 Geschrieben 13. Juli 2018 Melden Teilen Geschrieben 13. Juli 2018 Servus, ich steh irgenwie auf dem Schlauch, ich möchte die im nachfolgenden generierten Variablen aufrufen mit einem Platzhalten ähnlich wie sie auch angelegt werden. #Variablen anlegen $i= 1 $Computers = Get-Content -Path "c:\tmp\Test.txt" foreach($Computer in $Computers ){ New-Variable -Name "PC_number_$i" $i ++ } #Variablen ansteuern ohne diese manuell aufzurufen $i = 1 $PC_number_$i #geht nicht "$PC_number"_+"$i" #geht nicht $PC_number_+"$i" #geht nicht Habt ihr hier eine Lösung für mich? Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 13. Juli 2018 Melden Teilen Geschrieben 13. Juli 2018 Meistens wenn's ein New-... gibt, gibt's auch ein Remove-..., Set-... und ein Get-.... 1..5 | ForEach-Object{ New-Variable -Name "PC_number_$_" -Value $(Get-Random -Minimum 10 -Maximum 100 ) } 1..5 | ForEach-Object{ Get-Variable -Name PC_Number_$_ } Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 13. Juli 2018 Melden Teilen Geschrieben 13. Juli 2018 Mein Senf: Hier sollte man mit einem Array oder Custom Objects weiterarbeiten. Entscheidend ist, was später mit "Computers" gemacht werden soll. Zitieren Link zu diesem Kommentar
itsa 1 Geschrieben 16. Juli 2018 Autor Melden Teilen Geschrieben 16. Juli 2018 Hallo Zusammen, @BOfH_666 das auslesen ist ja kein Problem, ich möchte folgenden Programmcode gerne die einzelnen Variablen wieder aufrufen und mit Werten befüllen aber ohne das ich diese händisch angebe. Beim deklarieren in der Foreach Schleife gebe ich den Hauptnamen mit ( $PC_number_ ) und durch den Zähler ($i) den eindeutigen Namen. Wenn ich diese dann aufrufe geschieht die wieder in einer Forreach Schleife für jeden Computer und hier muss ich exakt an die Variablen ran kommen welche für den speziellen Computer einst generiert worden ist. Das heißt Computer1 in der Text.txt bekommt die $PC_number_1 und den Wert welchen ich rein schreibe ( Anzahl an Windows Updates ) und Computer2 ==> $PC_number_2 etc.pp. Für sowas müsste es doch eine Möglichkeit zum Aufrufen geben. leider funktioniert es mit den bisherigen Methoden nicht welche ich versucht habe. Beste Grüße Zitieren Link zu diesem Kommentar
testperson 1.707 Geschrieben 16. Juli 2018 Melden Teilen Geschrieben 16. Juli 2018 Hi, warum diesen "Umweg"? Mach das was du tun willst doch direkt in deiner ersten foreach-Schleife. Gruß Jan Zitieren Link zu diesem Kommentar
itsa 1 Geschrieben 16. Juli 2018 Autor Melden Teilen Geschrieben 16. Juli 2018 vor 2 Minuten schrieb testperson: Hi, warum diesen "Umweg"? Mach das was du tun willst doch direkt in deiner ersten foreach-Schleife. Gruß Jan Hi, Und wie rufe ich die Variablen wieder auf ohne die direkt zu benennen? In meinen folgenden foreach Schleifen wird auch wieder per Zähler $i die genaue ID der Computer aufgerufen welche an den Hauptvariablennamen angefügt werden muss, um diese aufzurufen. Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 16. Juli 2018 Melden Teilen Geschrieben 16. Juli 2018 Hmmm .... klingt ulkig. Ich glaub, ich schließ mich jetzt zahni und testperson an ... Haben die PC-Namen in der Text-Datei keine eindeutigen Namen? Wenn es PC-Namen in einer Domain sein sollten, sollten sie das aber haben. Vielleicht zeigst Du einfach mal ein bissl mehr von Deinem restlichen Code und/oder sagst, was Du am Ende erreichen möchtest .... vielelciht hast Du Dich in etwas verrannt und es gibt eine viel einfachere Lösung. vor 1 Minute schrieb itsa: Und wie rufe ich die Variablen wieder auf ohne die direkt zu benennen? Ganz einfach .... Du iterierst mit einer foreach-Schleife über Deine Variable $Computers .... !? Zitieren Link zu diesem Kommentar
itsa 1 Geschrieben 16. Juli 2018 Autor Melden Teilen Geschrieben 16. Juli 2018 (bearbeitet) In die generierten Variablen soll der Wert $WU_Status1 importiert werden damit am Ende geprüft werden kann ob der PC neuzustarten ist oder nicht. Und daher muss jeder Update Status genau mit jedem PC übereinstimmen welche am Schluss ausgewertet werden soll. $Computers = Get-Content -Path "c:\tmp\Test.txt" foreach($Computer in $Computers ){ New-Variable -Name "PC_number_$i" $i ++ } ############################################################# ######## Vorbereitungen - Kopieren und importieren ###### foreach ($Computer in $Computers){ #### $testpath = "\\" + $computer + "\C$\Windows\System32\WindowsPowerShell\v1.0\Modules\" [string]$Copypath = $testpath $item_path = $testpath + "PSWindowsUpdate\" $WU_Module_path = "\\" + $computer + "\C$\Windows\System32\WindowsPowerShell\v1.0\Modules\PSWindowsUpdate" $Path_result = Test-Path -Path $WU_Module_path # Modul importieren falls es nicht vorhanden ist if($Path_result -eq $false){ copy "C:\Temp\PSWindowsUpdate\" $testpath copy "C:\Temp\PSWindowsUpdate\*" $item_path Write-Host "Kopieren von WU-Update abgeschlossen" + $Computer Invoke-Command -ComputerName $Computer -ScriptBlock { Import-Module PSWindowsUpdate } Write-Host $Computer + "Modul importiert" } } ############################################################# ############################################################# ############# Anstarten der Updates auf allen PC's ########## $i = 1 foreach($Computer in $Computers){ $WU_Status1 = Invoke-Command -ComputerName $Computer -ScriptBlock { Get-WUInstall -ListOnly} PC_number_$i = $WU_Status1 if(!$WU_Status1){ $Computer + " keine Updates Verfügbar, fahre mit nächsten Computer fort" continue } Invoke-wuinstall -ComputerName $Computer -Script {Get-WUInstall -AcceptAll -AutoReboot -IgnoreUserInput} -Confirm:$false $Computer + " Update Installation 1 angestoßen" $i++ } # Warte 10 Minuten "Warte 10 Minuten" Start-Sleep -Seconds 120 ######################################################################################################### ############### Prüfe ob die PC's einen ausstehenden Neustart haben, falls ja Neustart durchführen ##### foreach ($Computer in $Computers){ $counter = 1 do{ $WU_Status2 = Invoke-Command -ComputerName $Computer -ScriptBlock { Get-WUInstall -ListOnly} #$Installer_Status = Invoke-Command -ComputerName $Computer -ScriptBlock {Get-WUInstallerStatus} $Computer + " Installer Status: " + $WU_Status2 + " Counter: " +$counter # Informativ damit man weiß wo das Skript steht if($WU_Status2){ "WU Status ist: " + $WU_Status2 "Warte 2 Minuten in Schleife zum Überwachen der Updates" Start-Sleep -Seconds 10 } $counter ++ } until((!$WU_Status2) -or ($counter -eq 10)) $reboot_pending = Invoke-Command -ComputerName $Computer -ScriptBlock { Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending"} $Computer + "Neustart ausstehend: " + $reboot_pending # Informativ damit man weiß wo das Skript steht if(($reboot_pending -eq $true) -or ($WU_Status1)){ $Computer + " Startet neu" Restart-Computer -ComputerName $Computer -Force } } # Warte 2 Minuten auf die Server bis Sie die Updates verarbeitet haben "Warte 2 Minuten in Schleife zum Überwachen des Update Status" Start-Sleep -Seconds 120 ######################################################################## ##### Zweite Update Installation ####################################### $i = 1 foreach ($Computer in $Computers){ $WU_Status3 = Invoke-Command -ComputerName $Computer -ScriptBlock { Get-WUInstall -ListOnly} #Update Status abfragen if((!$WU_Status3) -or (!$PC_number_[$i])){ $Computer + " keine Updates bei Installationschritt 2 Verfügbar, fahre mit nächsten Computer fort" $i++ continue } $i++ #$install_result = Invoke-Command -ComputerName $Computer -ScriptBlock {Get-WindowsUpdate} #Update Status abfragen if($WU_Status3){ Invoke-wuinstall -ComputerName $Computer -Script {Get-WUInstall -AcceptAll -AutoReboot -IgnoreUserInput} -Confirm:$false $Computer + " Update Installation 2 angestoßen" } $counter = 1 do{ $WU_Status3 = Invoke-Command -ComputerName $Computer -ScriptBlock { Get-WUInstall -ListOnly} $Computer + " Installer Status: " + $WU_Status3 + " | Counter: " +$counter # Informativ damit man weiß wo das Skript steht if($WU_Status3){ "Warte 2 Minuten in Schleife zum Überwachen des Installer Status" Start-Sleep -Seconds 120 } $counter ++ } until(!$WU_Status3) $reboot_pending = Invoke-Command -ComputerName $Computer -ScriptBlock { Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending"} $Computer + "Neustart ausstehend: " + $reboot_pending # Informativ damit man weiß wo das Skript steht if(($reboot_pending -eq $true) -or ($WU_Status3)){ $Computer + " Startet neu" Restart-Computer -ComputerName $Computer -Force } } bearbeitet 16. Juli 2018 von itsa Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 16. Juli 2018 Melden Teilen Geschrieben 16. Juli 2018 Bitte bitte editier den Beitrag nochmal und formatier den Code als Code. So isses schwer den zu kopieren und zu verstehen, weil er Zeilenumbrüche enthält, so keine hingehören!. Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 16. Juli 2018 Melden Teilen Geschrieben 16. Juli 2018 Wieso nutzt du nicht den eigendlichen Computername ($computer)? Wieso so umständlich? Zitieren Link zu diesem Kommentar
itsa 1 Geschrieben 16. Juli 2018 Autor Melden Teilen Geschrieben 16. Juli 2018 Gerade eben schrieb Dukel: Wieso nutzt du nicht den eigendlichen Computername ($computer)? Wieso so umständlich? Du meinst aus dem $Computers ein weiteres Array Feld betanken? Diese Variable verliert aber in der nächsten Foreach Schleife Ihre Werte weil diese ja neu betankt wird, oder sehe ich das falsch? Zitieren Link zu diesem Kommentar
testperson 1.707 Geschrieben 16. Juli 2018 Melden Teilen Geschrieben 16. Juli 2018 Ich würde noch fragen, wieso nicht "einfach" WSUS + GPO(s)? Alleine schon weil hier jeder Server jedes benötigte Update aus dem Internet zieht. Zitieren Link zu diesem Kommentar
itsa 1 Geschrieben 16. Juli 2018 Autor Melden Teilen Geschrieben 16. Juli 2018 WSUS und GPO läuft, hier geht es nur um das erzwingen der Updates für schnellere Bereitstellung der Server. Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 16. Juli 2018 Melden Teilen Geschrieben 16. Juli 2018 24 minutes ago, itsa said: Du meinst aus dem $Computers ein weiteres Array Feld betanken? Diese Variable verliert aber in der nächsten Foreach Schleife Ihre Werte weil diese ja neu betankt wird, oder sehe ich das falsch? Nein! In der Schleife ist $computer verfügbar. Wieso nutzt du das nicht sondern willst eine eigene Variable machen? Zitieren Link zu diesem Kommentar
testperson 1.707 Geschrieben 16. Juli 2018 Melden Teilen Geschrieben 16. Juli 2018 vor 32 Minuten schrieb itsa: WSUS und GPO läuft, hier geht es nur um das erzwingen der Updates für schnellere Bereitstellung der Server. Guck dir das mal an: https://blogs.msdn.microsoft.com/virtual_pc_guy/2015/06/16/script-image-factory-for-hyper-v/ 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.