WinFuture-Forum.de: PowerShell Skript mit Parametern aufrufen - WinFuture-Forum.de

Zum Inhalt wechseln

Windows 10: Alle News, der Download sowie zahlreiche Screenshots und Videos zum neuen Betriebssystem von Microsoft. Jetzt im WinFuture Windows 10 - Special informieren!
Seite 1 von 1

PowerShell Skript mit Parametern aufrufen


#1 Mitglied ist offline   TheBlackDragon 

  • Gruppe: aktive Mitglieder
  • Beiträge: 24
  • Beigetreten: 05. Juni 19
  • Reputation: 0

geschrieben 09. September 2019 - 09:23

Hallo,

habe mich jetzt in Advanced Function eingelesen und soweit funktionier mein Skript auch ohne Probleme.
Nur zu einzelnen Abschnitten und Anpassungen habe ich noch Fragen und Probleme.


Hier ist mein Code für die Aufrufparameter:
param(
    #Skript_umgeschreiben.ps1 -h
    [Parameter(Mandatory=$false,ParameterSetName=“help”)] #dieser Parameter ist jetzt überflüssig --> Funktioniert Hilfe wird aufgerufen bei AUsführung ohne Parameter
    [Alias(“h”)]
    [switch]$help,

    #Skript_umgeschreiben.ps1 -a 
    #Skript_umgeschreiben.ps1 -a -mail [email protected]
    [parameter(Mandatory=$false,ParameterSetName=“adminmode”)] 
    [Alias(“a”)]
    [switch]$adminmode,
    [parameter(Mandatory=$false,ParameterSetName=“adminmode”)] 
    [Validatescript({ $_ -match "[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"})]
    [string[]]$mail,

    #Aufruf des Mailmode mit -m
    [parameter(Mandatory=$false,ParameterSetName=“mailmode”)]
    [Alias(“m”)]
    [switch]$mailmode,

    #Aufruf des Batchmode mit -b  
    #[Skriptnamen].ps1 -b -pw [Pfad\DateiPW.txt]
    [parameter(Mandatory=$false,ParameterSetName=“batch”)]
    [Alias(“c”)]
    [switch]$conf,
    [parameter(Mandatory=$false,ParameterSetName=“batch”)]
    [Alias(“b”)]
    [switch]$batch,
    [parameter(Mandatory=$true,ParameterSetName=“batch”)] 
    [string]$pw,

    #Aufruf der Config mit -c
    [parameter(Mandatory=$false,ParameterSetName=“config”)]
    [Alias(“c”)]
    [switch]$conf,
    
    #Aufruf des Passwort mit -p
    [parameter(Mandatory=$true,ParameterSetName=“passwort”)]
    [Alias(“p”)]
    [switch]$password,

    [switch]$create_pwd_file=$false,
    [switch]$force=$false,
    [string]$path_to_VM_file="c:\temp\Datei.csv",
    [string]$OWNER="Owner",
    [string]$BACKUP_LOCAL="Backup Local",
    [string]$BACKUP_REMOTE="Backup Remote"
)





Im Abschnitt für den Schalter -h:
    #Skript_umgeschreiben.ps1 -h
    [Parameter(Mandatory=$false,ParameterSetName=“help”)] #dieser Parameter ist jetzt überflüssig --> Funktioniert Hilfe 
wird aufgerufen bei AUsführung ohne Parameter
    [Alias(“h”)]
    [switch]$help,


Dieser Abschnitt soll sowohl bei dem Aufruf [Skriptname].ps1 -h als auch beim Aufruf [Skriptname].ps1 angezeigt werden.
Aktuell wird die Hilfe nur beim Aufruf von -h aufgerufen.



Im Abschnitt für den Schalter -a -mail [E-Mail]:
    [parameter(Mandatory=$false,ParameterSetName=“adminmode”)] 
    [Alias(“a”)]
    [switch]$adminmode,
    [parameter(Mandatory=$false,ParameterSetName=“adminmode”)] 
    [Validatescript({ $_ -match "[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"})]
    [string[]]$mail,


Hier funktioniert alles ohne Probleme. Ich kann -a auch ohne Schalter -mail aufrufen. Kein Problem.
Das Senden der E-Mail funktioniert auch ohne Probleme.



Im Abschnitt für den Schalter: -c -b -pw
    [parameter(Mandatory=$false,ParameterSetName=“batch”)]
    [Alias(“c”)]
    [switch]$conf,
    [parameter(Mandatory=$false,ParameterSetName=“batch”)]
    [Alias(“b”)]
    [switch]$batch,
    [parameter(Mandatory=$true,ParameterSetName=“batch”)] 
    [string]$pw,


Dieser Abschnitt funktioniert nicht so ganz und hier habe ich noch Fragen:
Bevor der Batchmode aufgerufen werden kann, soll die Möglichkeit bestehen die Configs zu ändern.
Dies soll mit Aufruf -c erfolgen. Daher auch das $false bei Mandatory.
Die Konfigurationsdatei muss nicht unbedingt konfiguriert werden, da mit einem Skriptteil nach dieser Datei sucht und wenn diese nicht in den Vorgegebenen Pfaden ist ein False zurückgibt und das Skript abgebrochen wird.

Im gleichen Zuge soll gleich die Möglichkeit bestehen, die den eigentlichen Batchmode aufzurufen.
Dieser Aufruf braucht zwingend diese Aufrufparameter -b -pw [Passwortdatei].txt.
Daher steht auch das Mandatory bei PW auf $true.
Ohne den Parameter -c am Anfang funktioniert der Aufruf und der Druchlauf ohne Probleme. -b -pw [Dateiname].txt



Dennoch soll die Möglichkeit bestehen den Parameter -c also das Anpassen der Konfigurationsdatei alleine auch auszulegen.
Dennoch soll die Möglichkeit bestehen den Parameter -pw also das Anpassen der Passwortdatei alleine auch auszulegen.
Daher auch die zusätzlichen Aufrufe für -c und -p.

Nur dann kommt ein Aufruf, dass der [switch] String doppelt vorhanden ist.
Klar könnt eich einen zusätzlichen Pfad im Skript implementieren... das ist aber nicht Sinn der Sachen.

Natürlich sollen auch die verschiedenen Parameter auch andersrum aufgerufen werden können.



Zur Info noch meine aktuelle Skript Struktur:

   [CmdletBinding()] 
   param(
      #Hier befinden sich die Aufrufparameter
   )

   function skript_vm_help{
   }
   function create_password_file {
   }
   function read_password_file {
   }
   function mail_gueltigkeit {
   }
   function Mainone{
   }
   function aufruf_ausgabe_Adminmode {
   }
   function aufruf_ausgabe_OhneTags {
   }
   function aufruf_ausgabe_Owner {
   }
   function test-Mail {
   }

   if($help){
      skript_vm_help
   }elseif($adminmode){
      # ...
   }elseif($mailmode){
      # ...
   }elseif($batch){
      # ...
   }elseif($conf){
      # ...
   }elseif($password){
      # ...
   }else{skript_vm_help}




Was mach ich falsch oder habe ich etwas nicht verstanden?
Kann natürlich auch sein, dass ich mein Skript umstellen muss.

MfG
Alex
0

Anzeige



#2 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 09. September 2019 - 20:00

- "Hilfe" standardmäßig:
* Du solltest in Deiner Funktion oben irgendwo ein cmdletbinding() Attribut haben. Dort in die Klammer zusätzlich DefaultParameterSetName = "help" aufnehmen; wenn schon was da drin steht, mit Komma abtrennen.

- Parameter b, c und pw:
* Normalerweise braucht man das nicht so oft, es besteht aber die Möglichkeit, einem Parameter *mehrere* Parameterattribute mitzugeben. Das wäre an dieser Stelle ggfs. sinnvoll.

Ein Problem, daß sich ggfs. ergibt, ist die Frage, was der Parameter -Conf überhaupt machen soll. Momentan ist das ein Switch, der nützt uns für die Steuerung nicht viel.

Was mir spontan einfällt wäre in etwa sowas:

... 
[parameter(Mandatory=$false,ParameterSetName=“batch”)]
[parameter(Mandatory=$true,ParameterSetName=“confOnly”)]
    [Alias(“c”)]
    [string]$conf = 'Pfad\zur\Standard-Konfigdatei',
...



Dann hast Du den Parameter -Conf als String. Standardmäßig wird er mit dem Pfad\zur\Konfdatei' vorbelegt, WENN man nicht außerdem den Batchparameter angibt (-Conf ist optional für -Batch).
Wenn man -Conf aber alleine angibt, dann wird der ConfOnly-Modus ausgewählt und an der Stelle sind Angabe des Parameters und eines Werts dazu verpflichtend.

Noch ein bißchen sauberer wird es (unter Berücksichtigung Deiner Spezifikation) wenn man dem Parameter -Conf einen spezifischen Wert zuweist, der keine gültige Pfadangabe ist. Sagen wir "AUTO". Dann kann man das im Script prüfen und entsprechend verzweigen ("Auto" => suche Konfigdatei, jeder andere String => Pfad zu einer Datei; Datei lesen okay => gut; ansonsten Fehler).



Die Reihenfolge der bezeichneten Parameter ist egal. Um "positional" zu deaktivieren, kann man ab Powershell 5 ins cmdletbinding()-Attribut die Option PositionalBinding auf $false setzen, dann ist die Angabe des benannten Parameters Pflicht, egal in welcher Reihenfolge (aber immer nach Schema -Parameter $Wert).

Für die Zuweisung der ausgewählten Routine würdest Du idealerweise

switch($Pscmdlet.Parametersetname)
{
'setname_1' {...}
'setname_2' {...} 
default     {...}
}



verwenden. If/ElseIf wird zu unübersichtlich, und die Auswahl des aktiven Parametersets ist zuverlässiger als die Abfrage konkreter Variablen, wenn es um die Moduserkennung geht.

Im Zweifel immer semantisch herangehen.
-A- Wenn "-h" angegeben ist, will ich einen dedizierten Hilfemodus haben => Parametersetname am Parameter setzen.

-B- Wenn ich das Ganze ausführe, will ich wissen, ob der Hilfemodus aktiv ist. Falls ja, Hilfefunktion ausführen.

Das macht die Sache später auch handlicher, wenn es um Erweiterungen und/oder Du Variablennamen ändern möchtest. If($Help) sagt nicht viel aus; If($pscmdlet.parametersetname = 'Help') sagt Dir, daß der Hilfemodus aktiv ist, auch dann, wenn Du $Help mal in $Usage oder $Hilfemodus oder $Kuckuck umbenennen solltest.

Das ist umso wichtiger, wenn das Script so umfangreich werden sollte, wie Du's in Deiner Struktur schon andeutest.


Protip: Powershell kennt Module (Endung .PSM1 für Scriptmodule). Da kann man sowas wie
Get-ChildItem -Path $PsScriptRoot -Filter '*.ps1' | % { . $_.Fullname }


reinschreiben. Wenn man das macht, kann man im Modulverzeichnis einfach eine PS1-Datei für jede Funktion anlegen und wenn man das Modul dann importiert (mit Import-Module) werden alle Funktionen automatisch zusammengesucht und in PowerShell als Befehl bereitgestellt.

Aber das ist zumindest teilweise Geschmackssache, wie Du am besten mit der Verwaltung des ganzen Codes klarkommst.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0