Wenn mein PowerShell-Skript beispielsweise versucht, ein SQL Server-Objekt für einen nicht vorhandenen Server zu erstellen (in meinem Fall "bla"), zeigt PowerShell viele PowerShell-Fehler in Rot an.
Da mein Skript den Wert von $?
nach solchen Aufrufen überprüft und Fehler anzeigt und protokolliert, möchte ich lieber nicht, dass auch die verschiedenen Zeilen mit PowerShell-Fehlern angezeigt werden.
Wie kann ich diejenigen deaktivieren, die für mein Skript angezeigt werden?
quelle
-ErrorAction:SilentlyContinue
in PS 5.1 formatieren . Ich habe mein Cmdlet aus dem Stapel aufgerufen, daher weiß ich nicht, ob dies einen Unterschied macht. Aber gute Informationen, wenn Sie wissen, dass ein akzeptabler Fehler vorliegt, können ausgelöst werden.Windows PowerShell bietet zwei Mechanismen zum Melden von Fehlern: einen Mechanismus zum Beenden von Fehlern und einen anderen Mechanismus zum Nichtbeenden von Fehlern .
Interner CmdLets-Code kann eine
ThrowTerminatingError
Methode aufrufen , wenn ein Fehler auftritt, der es dem Cmdlet nicht erlaubt oder nicht erlauben sollte, seine Eingabeobjekte weiter zu verarbeiten. Der Skriptschreiber kann diese Ausnahme verwenden, um diesen Fehler abzufangen.EX :
Interner CmdLets-Code kann eine
WriteError
Methode aufrufen , um nicht terminierende Fehler zu melden, wenn das Cmdlet die Eingabeobjekte weiter verarbeiten kann. Der Skriptschreiber kann dann die Option -ErrorAction verwenden, um die Nachrichten auszublenden, oder die Option verwenden, um$ErrorActionPreference
das gesamte Skriptverhalten einzurichten .quelle
Ich hatte ein ähnliches Problem beim Versuch, Hostnamen mit aufzulösen
[system.net.dns]
. Wenn die IP nicht aufgelöst wurde. Net hat einen Beendigungsfehler ausgegeben. Um den Beendigungsfehler zu vermeiden und dennoch die Kontrolle über die Ausgabe zu behalten, habe ich eine Funktion mit erstelltTRAP
.Z.B
quelle
Du bist hier weit weg von der Spur.
Sie haben bereits eine schöne, große Fehlermeldung. Warum um alles in der Welt möchten Sie Code schreiben, der
$?
nach jedem einzelnen Befehl explizit überprüft wird ? Dies ist enorm umständlich und fehleranfällig. Die richtige Lösung ist , die Überprüfung zu beenden$?
.Verwenden Sie stattdessen den in PowerShell integrierten Mechanismus, um für Sie in die Luft zu jagen. Sie aktivieren es, indem Sie die Fehlereinstellung auf die höchste Stufe setzen:
Ich setze dies an die Spitze jedes einzelnen Skripts, das ich jemals geschrieben habe, und jetzt muss ich es nicht mehr überprüfen
$?
. Dies macht meinen Code wesentlich einfacher und zuverlässiger.Wenn Sie auf Situationen stoßen, in denen Sie dieses Verhalten wirklich deaktivieren müssen, können Sie entweder
catch
den Fehler beheben oder eine Einstellung mithilfe der allgemeinen Funktion an eine bestimmte Funktion übergeben-ErrorAction
. In Ihrem Fall möchten Sie wahrscheinlich, dass Ihr Prozess beim ersten Fehler stoppt, den Fehler abfängt und dann protokolliert.Beachten Sie, dass dies nicht der Fall ist, wenn externe ausführbare Dateien fehlschlagen (Exit-Code ungleich Null, konventionell). Sie müssen also immer noch prüfen,
$LASTEXITCODE
ob Sie welche aufrufen. Trotz dieser Einschränkung spart die Einstellung immer noch viel Code und Aufwand.Zusätzliche Zuverlässigkeit
Möglicherweise möchten Sie auch den strengen Modus verwenden :
Dies verhindert, dass PowerShell stillschweigend fortgesetzt wird, wenn Sie eine nicht vorhandene Variable verwenden und in anderen seltsamen Situationen. (
-Version
Einzelheiten zu den Einschränkungen finden Sie im Parameter.)Durch die Kombination dieser beiden Einstellungen wird PowerShell wesentlich fehlerfreier, was die Programmierung erheblich vereinfacht.
quelle
Fügen Sie
-ErrorAction SilentlyContinue
Ihrem Skript hinzu, und Sie können loslegen.quelle
In einigen Fällen können Sie nach dem Befehl eine Out-Null weiterleiten
quelle
Wenn Sie möchten, dass die Powershell-Fehlermeldung für ein Cmdlet unterdrückt wird, der Fehler jedoch weiterhin abgefangen werden soll, verwenden Sie "-erroraction 'silentlyStop'".
quelle
New-Item -ItemType directory
(PowerShell v2.0)