Powershell If mit Continue
Hallo Kollegen ich Grüße euch und wünsche einen wunderschönen Tag
Ich habe ein Problem mit einem kleinen Powershell script.
Ich möchte alle Server die einen Neustart benötigen (Windows Updates) per Script nachts neu starten. Ein paar Maschienen die aber auch Nachts laufen müssen vom Neustart ausnehmen...
Was ich schon habe... Alle Server/Clients werden angezeigt...
Das Problem sind die Ausschlüsse..
hier mein Script (das meiste aus der Knowledgebase von MS geklaut...)
if (!$wsus) {
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
}
$computerScope = new-object Microsoft.UpdateServices.Administration.ComputerTargetScope;
$computerScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::InstalledPendingReboot;
$updateScope = new-object Microsoft.UpdateServices.Administration.UpdateScope;
$updateScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::InstalledPendingReboot;
$computers = $wsus.GetComputerTargets($computerScope);
$computers | foreach-object {
$_.FullDomainName | out-file -filepath W:\wsus\Clients_reboot_needed.txt -encoding Default -append
$_.FullDomainName |foreach-object {
if ($_ -eq 'Server1.Domain.de'){
continue
}
if ($_ -eq 'Server2.Domain.de'){
continue
}
if ($_ -eq 'Server3.Domain.de'){
continue
}
if ($_ -eq 'Server4.Domain.de'){
continue
}
if ($_ -eq 'Server5.Domain.de'){
continue
}
if ($_ -eq 'Server6.Domain.de'){
continue
}
write-host $_
}
Wenn ich nun dieses Scriptchen ausführe listet er mir nur 2,3 Rechner auf. Wenn ich aber das Continue weglasse sind es wesentlich mehr...
Ich will einfach wenn der Servername gefunden wird, die Schleife zurücksetzen und mit dem nächsten Wert starten... aber aufgrund irgendeinem Fehler will er nicht... Er läuft bis der erste Name matched und steigt dann aus der gesamten Schleife aus... wie bei Break (da gibt genau das gleiche Ergebnis zurück).
Wenn man die If Abfragen auf ElseIf umstrickt gibt er schon mehr Clients zurück... Aber immer noch nicht alle...
Continue sollte doch der richtige Befehl sein oder?
Grüße Lenny
Ich habe ein Problem mit einem kleinen Powershell script.
Ich möchte alle Server die einen Neustart benötigen (Windows Updates) per Script nachts neu starten. Ein paar Maschienen die aber auch Nachts laufen müssen vom Neustart ausnehmen...
Was ich schon habe... Alle Server/Clients werden angezeigt...
Das Problem sind die Ausschlüsse..
hier mein Script (das meiste aus der Knowledgebase von MS geklaut...)
if (!$wsus) {
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
}
$computerScope = new-object Microsoft.UpdateServices.Administration.ComputerTargetScope;
$computerScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::InstalledPendingReboot;
$updateScope = new-object Microsoft.UpdateServices.Administration.UpdateScope;
$updateScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::InstalledPendingReboot;
$computers = $wsus.GetComputerTargets($computerScope);
$computers | foreach-object {
$_.FullDomainName | out-file -filepath W:\wsus\Clients_reboot_needed.txt -encoding Default -append
$_.FullDomainName |foreach-object {
if ($_ -eq 'Server1.Domain.de'){
continue
}
if ($_ -eq 'Server2.Domain.de'){
continue
}
if ($_ -eq 'Server3.Domain.de'){
continue
}
if ($_ -eq 'Server4.Domain.de'){
continue
}
if ($_ -eq 'Server5.Domain.de'){
continue
}
if ($_ -eq 'Server6.Domain.de'){
continue
}
write-host $_
}
Wenn ich nun dieses Scriptchen ausführe listet er mir nur 2,3 Rechner auf. Wenn ich aber das Continue weglasse sind es wesentlich mehr...
Ich will einfach wenn der Servername gefunden wird, die Schleife zurücksetzen und mit dem nächsten Wert starten... aber aufgrund irgendeinem Fehler will er nicht... Er läuft bis der erste Name matched und steigt dann aus der gesamten Schleife aus... wie bei Break (da gibt genau das gleiche Ergebnis zurück).
Wenn man die If Abfragen auf ElseIf umstrickt gibt er schon mehr Clients zurück... Aber immer noch nicht alle...
Continue sollte doch der richtige Befehl sein oder?
Grüße Lenny
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 168314
Url: https://administrator.de/contentid/168314
Ausgedruckt am: 24.11.2024 um 06:11 Uhr
22 Kommentare
Neuester Kommentar
So... hab mal n bisschen drübergelesen.
Also wenn ich das richtig verstehe, versuchst du mit
die Clients wegzuschreiben, die erlaubt sind, oder?
Aber was passiert, wenn der Client nicht vorkommt?
Dann hängt die Schleife ohne Anweisung irgendwo.
Kann sein, dass ich des falsch verstehe, aber für mich hast du hier keine "Ausnahmen" sondern nur erlaubte Clients.
Und sobald ein Client kommt, der nicht aufgeführt wird, macht dein Script nichtsmehr.
Hab ich das so richtig verstanden?
Also wenn ich das richtig verstehe, versuchst du mit
if ($_ -eq 'Server1.Domain.de'){
continue
}
continue
}
die Clients wegzuschreiben, die erlaubt sind, oder?
Aber was passiert, wenn der Client nicht vorkommt?
Dann hängt die Schleife ohne Anweisung irgendwo.
Kann sein, dass ich des falsch verstehe, aber für mich hast du hier keine "Ausnahmen" sondern nur erlaubte Clients.
Und sobald ein Client kommt, der nicht aufgeführt wird, macht dein Script nichtsmehr.
Hab ich das so richtig verstanden?
Hab nochmal oben nachgelesen...
Ich bin nicht der große Powershell-Guru, aber warum willst du die Schleife zurücksetzen?
Für deine ersten Tests (Du schreibst das ganze ja momentan nur in ein Logfile) ist es doch unsinnig, die Schleife zurücksetzen zu wollen
Wenn du einfach anstatt deine IF-Abfragen, das ganze sofort mit write-host $_ ins Logfile schreibst, müsstest du doch am Ende in deinem Logfile alle Clients stehen haben, die einen Reboot benötigen. Und genau das willst du doch, oder?
Fragende Grüße,
LF
Ich will einfach wenn der Servername gefunden wird, die Schleife zurücksetzen
Ich bin nicht der große Powershell-Guru, aber warum willst du die Schleife zurücksetzen?
Für deine ersten Tests (Du schreibst das ganze ja momentan nur in ein Logfile) ist es doch unsinnig, die Schleife zurücksetzen zu wollen
Wenn du einfach anstatt deine IF-Abfragen, das ganze sofort mit write-host $_ ins Logfile schreibst, müsstest du doch am Ende in deinem Logfile alle Clients stehen haben, die einen Reboot benötigen. Und genau das willst du doch, oder?
Fragende Grüße,
LF
if (!$wsus)
{
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
}
$computerScope = new-object Microsoft.UpdateServices.Administration.ComputerTargetScope;
$computerScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::InstalledPendingReboot;
$updateScope = new-object Microsoft.UpdateServices.Administration.UpdateScope;
$updateScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::InstalledPendingReboot;
$computers = $wsus.GetComputerTargets($computerScope);
$computers | foreach-object
{
$_.FullDomainName | out-file -filepath C:\Temp\test.txt -encoding Default -append
$_.FullDomainName | foreach-object
{
if ($_ -eq 'Server1.Domain.de')
{
continue
}
elseif ($_ -eq 'Server2.Domain.de')
{
continue
}
elseif ($_ -eq 'Server3.Domain.de')
{
continue
}
elseif ($_ -eq 'Server4.Domain.de')
{
continue
}
elseif ($_ -eq 'Server5.Domain.de')
{
continue
}
elseif ($_ -eq 'Server6.Domain.de')
{
continue
}
else
{
}
write-host $_
}
}
Verbessert das das ganze?
Und falls du dich fragst, warum ich als relativer PS-Neuling versuche, das ganze hinzukriegen:
Ich sitze ebenfalls gerade an meinen ersten Powershell-Scripts und dachte mit "Geteiltes Leid is halbes Leid"
Grüße,
LF
Probier mal folgendes:
Somit müsstest du zumindest die richtige Ausgabe in Clients_reboot_needed.txt haben
if (!$wsus)
{
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
}
$file="W:\wsus\Clients_reboot_needed.txt"
$computerScope = new-object Microsoft.UpdateServices.Administration.ComputerTargetScope;
$computerScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::InstalledPendingReboot;
$updateScope = new-object Microsoft.UpdateServices.Administration.UpdateScope;
$updateScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::InstalledPendingReboot;
$computers = $wsus.GetComputerTargets($computerScope);
$computers | foreach-object
{
$_.FullDomainName | foreach-object
{
if ($_ -eq 'Server1.Domain.de')
{
continue
}
elseif ($_ -eq 'Server2.Domain.de')
{
continue
}
elseif ($_ -eq 'Server3.Domain.de')
{
continue
}
elseif ($_ -eq 'Server4.Domain.de')
{
continue
}
elseif ($_ -eq 'Server5.Domain.de')
{
continue
}
elseif ($_ -eq 'Server6.Domain.de')
{
continue
}
write-host $_
out-file -filepath $file -inputobject $_ -append -encoding default
}
}
Somit müsstest du zumindest die richtige Ausgabe in Clients_reboot_needed.txt haben
Ein Problem dürfte zumindest gewesen sein, dass er dir nicht deine neu gestartetet Clients in das Logfile geschrieben hat, sondern durch
hast du dir hier (glaube ich) alle Clients auflisten lassen, da diese Zeile ja von den "continue" -Zeilen nicht betroffen ist.
Wenn das neue Script das tut, was es soll, schreibt es nur in das Logfile, wenn kein continue erreicht wurde.
Bin gespannt auf das Ergebnis.
Grüße,
LF
$_.FullDomainName | out-file -filepath W:\wsus\Clients_reboot_needed.txt -encoding Default -append
hast du dir hier (glaube ich) alle Clients auflisten lassen, da diese Zeile ja von den "continue" -Zeilen nicht betroffen ist.
Wenn das neue Script das tut, was es soll, schreibt es nur in das Logfile, wenn kein continue erreicht wurde.
Bin gespannt auf das Ergebnis.
Grüße,
LF
Hier dürfte dieser Fehler nicht vorkommen:
[EDIT]
Schön formatiert
[EDIT]
[EDIT]
Schön formatiert
[EDIT]
if (!$wsus)
{
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
}
$file = "W:\wsus\Clients_reboot_needed.txt"
$computerScope = new-object Microsoft.UpdateServices.Administration.ComputerTargetScope;
$computerScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::InstalledPendingReboot;
$updateScope = new-object Microsoft.UpdateServices.Administration.UpdateScope;
$updateScope.IncludedInstallationStates = [Microsoft.UpdateServices.Administration.UpdateInstallationStates]::InstalledPendingReboot;
$computers = $wsus.GetComputerTargets($computerScope);
$computers | foreach-object {
$_.FullDomainName | foreach-object {
if ($_ -eq "Server1.Domain.de")
{
continue
}
elseif ($_ -eq "Server2.Domain.de")
{
continue
}
elseif ($_ -eq "Server3.Domain.de")
{
continue
}
elseif ($_ -eq "Server4.Domain.de")
{
continue
}
elseif ($_ -eq "Server5.Domain.de")
{
continue
}
elseif ($_ -eq "Server6.Domain.de")
{
continue
}
write-host $_
out-file -filepath $file -inputobject $_ -append -encoding default
}
}
Hallo Lenny,
ich seh schon... ich hab in dem Bereich zu wenig KnowHow, um dir weiterzuhelfen.
Aber nen Versuch wars wert
Ich hab mir ein Vergleichsscript gebaut, um deinen Fehler nachzuvollziehen. Und es tut genau das, was du möchtest.
Es springt nur zu "write-host", wenn die If-Bedingung nicht zutrifft.
Deshalb verstehe ich nicht, warum es in dienem Fall nicht funktioniert.
Aber ich befürchte, ich komm nicht dahinter.
Grüße,
LF
ich seh schon... ich hab in dem Bereich zu wenig KnowHow, um dir weiterzuhelfen.
Aber nen Versuch wars wert
Ich hab mir ein Vergleichsscript gebaut, um deinen Fehler nachzuvollziehen. Und es tut genau das, was du möchtest.
Es springt nur zu "write-host", wenn die If-Bedingung nicht zutrifft.
$ints = @(1,2,3,4,5)
$File ="C:\Temp\test.txt"
foreach ($i in $ints)
{
if ($i -eq '1')
{
continue
}
elseif ($i -eq '2')
{
continue
}
write-host $i
out-file -filepath "C:\Temp\test.txt" -inputobject $i -append -encoding default
}
Deshalb verstehe ich nicht, warum es in dienem Fall nicht funktioniert.
Aber ich befürchte, ich komm nicht dahinter.
Grüße,
LF