scbe 0 Report post Posted July 11 (edited) 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 Edited July 11 by scbe Quote Share this post Link to post Share on other sites
Dukel 258 Report post Posted July 11 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 Quote Share this post Link to post Share on other sites
MurdocX 117 Report post Posted July 11 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)] Quote Share this post Link to post Share on other sites
Dukel 258 Report post Posted July 11 Hier kann man aber wohl nur eine Hilfezeile angeben und nicht die komplexen Hilfen mit Beispielen und Ein/Ausgabe. Quote Share this post Link to post Share on other sites
MurdocX 117 Report post Posted July 11 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. Quote Share this post Link to post Share on other sites
scbe 0 Report post Posted July 11 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 Quote Share this post Link to post Share on other sites
Dukel 258 Report post Posted July 11 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 Quote Share this post Link to post Share on other sites
MurdocX 117 Report post Posted July 11 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 Quote Share this post Link to post Share on other sites
scbe 0 Report post Posted July 11 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 Quote Share this post Link to post Share on other sites