PowerShell-Problem - geschweifte Klammern der IF-Anweisung

1180
STGdb

Ich bin mit PS auf etwas gestoßen und weiß nicht, ob ich etwas falsch mache oder vielleicht ist es nur ein Fehler in PS (und ich kann die Antwort nirgendwo finden)? Ich habe dies mit PS v4, v5.0 und v5.1 unter verschiedenen Windows-Betriebssystemen getestet. Zunächst scheint es, dass das Betriebssystem unabhängig von der PS-Version ist. Wenn ich das folgende Code-Snippet unten direkt entweder über ein PS-Fenster oder über ein PS-Skript ausführe, erhalte ich keine Fehler und alles scheint in Ordnung zu sein :

$error.clear() If ($error -ne $null) { $error } 

Bei bestimmten Systemtypen (die anscheinend ein auf dem Betriebssystem basierendes Problem sind) führe ich jedoch den folgenden Code aus und erhalte manchmal eine Fehlermeldung:

$error.clear() If ($error -ne $null) { $error } 

Ich kann den obigen Fehlererzeugungscode auf Windows 10- und Windows 2016-Servern ausführen und alles ist in Ordnung (es werden keine Fehler gemeldet). Wenn ich den gleichen Code unter Windows 2008 R2 oder Windows 2012 R2 ausführen, erhalte ich die folgende Fehlermeldung:

Missing statement block after If ( condition ). 

Es scheint egal zu sein, ob auf den Windows 2008 R2- und Windows 2012 R2-Systemen PS 4, 5 oder 5.1.1 installiert ist. Ich bekomme immer noch die Fehlermeldung. Und es scheint egal zu sein, ob ich als Admin arbeite oder nicht, die gleichen Ergebnisse. Es scheint keinen Unterschied zu machen, ob es sich um Domänenverbund- oder Arbeitsgruppensysteme handelt. Alle unsere Systeme sind mit den Patches vom Mai 2017 aktualisiert worden.

Ist es eine PS-Anforderung (auf Windows 2008 R2- und Windows 2012 R2-Systemen), dass sich die öffnende geschweifte Klammer einer PS-IF-Anweisung in derselben Zeile befinden muss wie die IF-Anweisung selbst? Bei Windows 10 und Windows 2016 Server scheint dies nicht der Fall zu sein.

Danke im Voraus,

UCG

3
Was passiert, wenn sich die geschweifte Startklammer in derselben Zeile wie Ihre if-Bedingung befindet und nicht in der nächsten Zeile? Ich weiß, dass PowerShell theoretisch keine Platzierung um geschweifte Klammern interessiert, sondern für die Vollständigkeit, um etwa seltsame neue Linienzeichen usw. auszuschließen. Verwenden Sie Notepad, PowerShell IDE oder einen anderen Editor? Kinnectus vor 6 Jahren 0
Dies hängt vollständig vom verwendeten Parser ab. Ich würde erwarten, dass der Powershell-Parser intern ist, aber da er mit einem Dutzend verschiedener Skript-Dialekte funktioniert, ist das vielleicht nicht ganz richtig. In jedem Fall empfehle ich die RKR-Formatierung und setze die Öffnung mit der Steueranweisung in die Zeile. Ich habe es nie gemocht, eine ganze Zeile mit einem lockigen Anfang zu verschwenden. Frank Thomas vor 6 Jahren 0
@Kinnectus - Wenn sich die geschweifte Startzeile in derselben Zeile befindet, werden keine Fehler angezeigt (dies gilt jedoch nur für Windows 2008 R2 und Windows 2012 R2). Windows 10 und Windows 2016 scheinen nichts dagegen zu haben, ob sich die Klammer in einer neuen Zeile befindet oder nicht. STGdb vor 6 Jahren 0
@ Frank Thomas - Das direkte Ausführen von einem PS-Fenster (das in das Windows-Betriebssystem integriert ist) führt zu dem Fehler. Ich habe ein sauberes Server-Betriebssystem in einer Arbeitsgruppe (direkt von MS-ISO-Medien) bereitgestellt und die gleichen Ergebnisse auf dem neuen 2012 R2-Server erhalten (es wurde nichts "Extra" darauf installiert und das Betriebssystem wurde nicht gepatcht). Es scheint jedoch definitiv OS-bezogen zu sein. STGdb vor 6 Jahren 0
Viele unserer (vorhandenen) Skripts sind zur besseren Lesbarkeit auf diese Weise formatiert (wobei die öffnende IF-Anweisung eine geschweifte Klammer in einer neuen Zeile darstellt). Neulich wollte ich ein Fehler-Trapping zu einem vorhandenen Skript hinzufügen, und beim Testen fiel mir auf, dass dieser Fehler gemeldet (und eingefangen) wurde, sodass das Skript beendet wurde. Ich gehe davon aus, dass dies schon eine Weile passiert ist, und wir haben nie gewusst, dass es so war, bis ich versucht habe, Fehler einzufangen. Danke euch beiden für eure Antworten. STGdb vor 6 Jahren 0
Was passiert, wenn Sie von der ISE laufen? Von der ISE aus wurde dies ohne Fehler unter Win 10 x64 v5.1, Win 7 x86 v2.0 und Win 2008 r2 x86 v2.0 abgeschlossen. Wenn Sie direkt in Powershell eingeben, erhalte ich die Fehlermeldung "Missing statement" auf der Win7-Maschine, aber nicht auf der Win10-Maschine. root vor 6 Jahren 0
@ root - Ja, gleiche Ergebnisse. Noch keine Fehler unter Windows 10 oder 2016 Ich bekomme den Fehler bei 2008 R2 und 2012 R2 in ISE STGdb vor 6 Jahren 0
Können Sie bestätigen, für welche Sprache diese Server mit dem betroffenen Problem konfiguriert oder konfiguriert wurden. Haben Sie die Logik [TRY ... CATCH] (https://ss64.com/ps/try.html) getestet, um zu sehen, ob sie mit der Fehlerprüflogik, die Sie zu integrieren versuchen, anders funktioniert? Es gibt auch [Trap] (https://ss64.com/ps/trap.html), deshalb wollte ich nur darauf hinweisen. Pimp Juice IT vor 6 Jahren 0
@ McDonald's - Gute Idee, danke. Ich habe Try / Catch getestet und dabei auch einen Fehler erhalten (der Fehler schien dem gleichen Fehler zu folgen wie der andere Fehler, nicht Win10 / 2016, sondern 2008R2 / 2012R2). Der einzige Unterschied ist, dass bei Try / Catch die Fehlermeldung anders ist. Der Fehler, den ich erhalte, ist "Die Try-Anweisung fehlt ihrem Anweisungsblock". Sie sind alle für die englische Sprache eingerichtet. STGdb vor 6 Jahren 0
Es könnte am besten sein, den Code für 2008 R2 / 2012 R2 kompatibel zu machen, sodass die Änderung an allen anwendbaren Skripts vorgenommen wird. Möglicherweise können Sie die Einrichtung des Codes und der Skripte von einem 2016-Server ausführen und auf den Servern von 2008 und 2012 remote ausführen und prüfen, ob dasselbe Verhalten vorliegt oder ob es auf dieser Ebene auch mit der geschweiften Klammer geschieht. Ich weiß, wie schwierig es ist, Skripts über mehrere Plattformen hinweg zu verwalten, und dass nicht alles standardmäßig Standard für alle Umgebungen ist, in denen Sie Skripts automatisieren und so weiter. Daher kenne ich auch das Gefühl Pimp Juice IT vor 6 Jahren 0
Was ist los damit? Hattest du neue Erkenntnisse usw.? Haben Sie eine andere Lösung gefunden, beispielsweise die Aktualisierung der Skripte? Dies kann eine Belohnung von 50 Punkten wert sein, um mehr Aufmerksamkeit zu erhalten, wenn Sie es unbedingt brauchen. Pimp Juice IT vor 6 Jahren 0

2 Antworten auf die Frage

0
Fazer87

When PowerShell is fed a line (or block) of code - it evaluates that block (or line) as a whole

In this case, your first line is: If ($error -ne $null)

PowerShell knows how to interperate the line, but its invalid syntax because PowerShell doesn't have a "what to do" block in the event that the criteria is met.

enter image description here

If you feed PowerShell the block as a whole - it recognises the "what to do block" and knows where it needs to go next:

enter image description here

Are you able to elabourate more on which systems and platforms you are finding that accept the single lines? I have just tested this on Win10 (PowerShell 5), 2012R2 (Powershell 4 and 5), Windows 7 (PowerShell 4 and 5) and they all behave exactly the same.

0
tgrignon

Ich hatte das gleiche Problem, als mein Anweisungsblock eine Here-Zeichenfolge enthielt

If ($error -ne $null) { $query = @"  do some sql; do more sql;  "@ } 

Als ich es ohne Here-String in eine Zeile änderte, funktionierte es

If ($error -ne $null) { $query = "do some sql;do more sql;" } 

In Ihrem Anweisungsblock ist möglicherweise etwas enthalten, das von Powershell nicht als mehrzeilig zulässig ist.