Jump to content
Sign in to follow this  
itsa

Automatisch generierte Variablen ansteuern

Recommended Posts

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?

 

Share this post


Link to post
Share on other sites

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_$_
    }

 

Share this post


Link to post
Share on other sites

Mein Senf: Hier sollte man mit einem Array oder Custom Objects weiterarbeiten. Entscheidend ist, was  später mit "Computers"  gemacht werden soll.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

 

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
    }

}

 

Edited by itsa

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Werbepartner:



×
×
  • Create New...