scbe 0 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 (bearbeitet) Hallo Leute, guten Tag erstmal. Hab' mich eben erst angemeldet, bin also der Neue.. :o) Ich möchte Euch mal fragen, wie Ihr sowas macht und was ggf. als der Beste Weg erachtet wird. Im PowerShell bin ich noch recht neu, es fehlt noch an Erfahrung! Ich schreibe eine Menge PowerShell Scripte, welche im Monitoring mit Nagios/Icinga2 von Windows Servern zum Einsatz kommen. Fast alle diese Scripte erwarten bestimmte Argumente beim Aufruf wobei jedes Argument verschiedene Parameter haben kann, ohne die sie nicht funktionieren können. Nun weiß ja der User, welcher das Monitoring einrichtet, nicht unbedingt welche Argumente erwartet werden. In die Scripte kann er aber auch nicht reinschauen, weil die auf dem Server liegen und er da gar nicht rankommt. Jetzt möchte ich eine einheitliche "Hilfe" im Script hinterlegen, welche z.B. mit einem Argument "-help ?" abgerufen werden kann. Diese Hilfe sollte die zu übergebenden Argumente und deren mögliche Parameter enthalten. Wie macht Ihr sowas? Welche Möglichkeiten gibt es hier? Vorab vielen Dank Grüße bearbeitet 11. Juli 2019 von scbe Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 Genau dies Möglichkeit ist schon implementiert: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comment_based_help?view=powershell-6 1 Zitieren Link zu diesem Kommentar
MurdocX 952 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 Auch in den Advanced Parameter kann eine Hilfe hinterlegt werden: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_advanced_parameters?view=powershell-6 [Parameter(HelpMessage='', HelpMessageBaseName, HelpMessageResourceId)] Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 Hier kann man aber wohl nur eine Hilfezeile angeben und nicht die komplexen Hilfen mit Beispielen und Ein/Ausgabe. Zitieren Link zu diesem Kommentar
MurdocX 952 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 Je nach was die Anforderung ist und welche Hilfestellung wirklich gebraucht wird benutze ich das Ein oder eben das Andere. Gerne nutze die kurze Hilfestellung, damit ich kurz und prägnant weiß welche Daten in dem Parameter wirklich übergeben werden muss. Zitieren Link zu diesem Kommentar
scbe 0 Geschrieben 11. Juli 2019 Autor Melden Teilen Geschrieben 11. Juli 2019 vor einer Stunde schrieb Dukel: Hier kann man aber wohl nur eine Hilfezeile angeben und nicht die komplexen Hilfen mit Beispielen und Ein/Ausgabe. Hallo Dukel, MurdocX, super, danke erstmal. Ich würde für meine Scripte den "Microsoft Weg" https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_advanced_parameters?view=powershell-6 gehen. Allerdings hab' ich noch nicht ganz verstanden, wie ich das dann aufrufe. Folgendes lege ich im Script an: <# .Parameter Arg string - date, time, datetime, day, dayname, dayshortname, month, monthname, monthshortname, year, hour, minute, second, uptime, timezone .Parameter warn string - warning treshold .Parameter crit string - critical treshold .EXAMPLE /usr/lib/nagios/plugins/check_nrpe -t 50 -H <HOSTNAME.DOMAIN> -c check_win_datetime -a timezone #> param( [string]$Arg = "uptime", [string]$warn = 0, [string]$crit = 0 ) Ich habe 3 Parameter, welche erwartet werden. Für jeden dieser Parameter habe ich ein ".Parameter" angelegt. Wie rufe ich nun das Script auf, um die entsprechende Zeile(n) zu bekommen. Letztenlich will ich alle auf einmal haben. DANKE Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 Das andere ist auch der Microsoft Weg. Du kannst das ganze wie bei allen Scripten mit get-help ./scriptname und die entsprechenden Parameter -full, -example,... aufrufen. get-help ./scriptname -full Zitieren Link zu diesem Kommentar
MurdocX 952 Geschrieben 11. Juli 2019 Melden Teilen Geschrieben 11. Juli 2019 Einen kleinen Vorschlag möchte ich bringen: param( [string]$Arg = "uptime", [string]$warn = 0, [string]$crit = 0 ) würde ich eher in: param( [string]$Arg = "uptime", [int]$warn = 0, [int]$crit = 0 ) ändern. Denn 0 ist eher ein Integer, als ein String. ($warn, $crit) Hier kannst du mehr Klarheit und weniger Fehleranfälligkeit in dein Skript bringen. Auch würde ich die Variablen ausschreiben. Es kann nicht schaden, Dir und Anderen mehr Sicherheit im Umgang mit den Paramentern bringen. Vielleicht schaut man das Skript in 2 Jahren das nächste Mal erst an. Ergänzung Alternativ, falls diese Parameter nur 0 oder 1 können (True, False), solltest du einfach [switch] verwenden. param ( [string]$Arg = 'uptime', [switch]$Warning, [switch]$Critical ) Wobei das auch nochmal vereinfacht werden kann. [Parameter(Mandatory,HelpMessage='Aktueller Sicherheitsstatus (Warning,Critical) wird erwartet.')] [ValidateSet('Warning','Critical')] [string] $Status Zitieren Link zu diesem Kommentar
scbe 0 Geschrieben 11. Juli 2019 Autor Melden Teilen Geschrieben 11. Juli 2019 Gerade eben schrieb MurdocX: Einen kleinen Vorschlag möchte ich bringen: param( [string]$Arg = "uptime", [string]$warn = 0, [string]$crit = 0 ) würde ich eher in: param( [string]$Arg = "uptime", [int]$warn = 0, [int]$crit = 0 ) ändern. Denn 0 ist eher ein Integer, als ein String. ($warn, $crit) Hier kannst du mehr Klarheit und weniger Fehleranfälligkeit in dein Skript bringen. Auch würde ich die Variablen ausschreiben. Es kann nicht schaden, Dir und Anderen mehr Sicherheit im Umgang mit den Paramentern bringen. Vielleicht schaut man das Skript in 2 Jahren das nächste Mal erst an. So, jetzt hab' ich's! vielen Dank Euch beiden. <# .Parameter Arg string - date, time, datetime, day, dayname, dayshortname, month, monthname, monthshortname, year, hour, minute, second, uptime, timezone .Parameter warn string - warning treshold .Parameter crit string - critical treshold .EXAMPLE /usr/lib/nagios/plugins/check_nrpe -t 50 -H <HOSTNAME.DOMAIN> -c check_win_datetime -a timezone .EXAMPLE /usr/lib/nagios/plugins/check_nrpe -t 50 -H <HOSTNAME.DOMAIN> -c check_win_datetime -a -Arg uptime -warn 60 -crit 80 #> param( [string]$Arg = "uptime", [string]$warn = 0, [string]$crit = 0 ) Aufruf dann so: Get-Help .\<scriptname> -Full # oder z.B.: Get-Help .\<scriptname> -Parameter Arg # oder z.B.: Get-Help .\<scriptname> -Examples @MurdocX Du hast natürlich, wenn alles "normal" wäre :o) Recht. Es sieht in meinem Beispiel eher nach Integern aus. In er Tat ist es aber so, dass es bei Argumenten "warn" und "crit" auch Strings übergeben werden können, je nach "Arg". Ist also so gewollt und wird im Script entsprechend verarbeitet. Nochmals vielen Dank an alle.. Bernd Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.