Jump to content

Automatisch generierte Variablen ansteuern


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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?

 

Link zu diesem Kommentar

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

Link zu diesem Kommentar
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.

Link zu diesem Kommentar

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.  ;-):D

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 .... !?

Link zu diesem Kommentar

 

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 von itsa
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

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...