WinFuture-Forum.de: PowerShell Arbeit mit mehreren Schaltern - 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 Arbeit mit mehreren Schaltern


#1 Mitglied ist offline   TheBlackDragon 

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

geschrieben 28. August 2019 - 08:48

Sehr geehrte Damen und Herren,

in einem meiner Vorherigen Beiträge habe ich nach dem Hilfe für den Aufruf eines Skriptes mit Schaltern gefragt.
Hierbei ging es um diesen Codeschnipsel:

Param(
    [alias("H")][switch]$Help,  
    [alias("A")][switch]$Admin,
    [alias("M")][switch]$Mailwaehlen,
    [alias("B")][switch]$Batch, 
    [alias("C")][switch]$config, 
    #Credential file Erstellung
    [switch]$create_pwd_file=$false,
    [switch]$force=$false
)

if($Help){
        Write-Host 
        Write-Host " Aufruf mit Parametern [-r] [-a] [-h] "
        Write-Host 
        Write-Host    "  `t -r ... Senden von VM Infos an gewuenschte E-Mail"
        Write-Host    "  `t -a ... Ausfuehrung als Admin mit Ausgabe aller Informationen:"
        Write-Host    "         `t`t`t   VMName Owner Backup Local Backup Remote "
        Write-Host    "         `t`t`t   Zustand vCPU vRAM vDisk HWVersion ToolsVersion  "      
        Write-Host    "  `t -h ... Anzeige dieser Hilfe
        Write-Host 
}

if($Admin){
        Write-Host admin
}     

if($Mailwaehlen){
        Write-Host "Anpassung EMail"
}

if($Batch){
        Write-Host "Aufruf und Duchlauf des Skripts"
}

if($config){
        Write-Host "Anpassung der Config Datei"
}



Der Aufruf -h, -b, -m, -c und -a funktionieren ohne Probleme.

Nun kam mir der Gedanke, wie wäre es wenn ich das Skript beispielsweise mit zwei Schaltern aufrufen würde.
Und zwar würde dies so aussehen:

Test.ps1 -c -b

Das -c steht für den Aufruf der Konfigurationsdatei und das -b steht für den Durchlaufs für dieses Skriptes.
Wenn beim Aufruf des Skriptes -c mitgegeben wird, sollen die Einstellungen für die conf Datei erneut gesetzt werden können. Wenn diese Einstellungen gesetzt sind und der Pfad abgearbeitet ist, soll das Skript im ganz normal durchlaufen.
Wie muss ich [alias("B")][switch]$Batch anpassen?

Desweiteren habe ich mich überlegt, dass mit dem Schalter -p eine Passwortdatei erstellt werden.
Skript_PowerShell.ps1 -p [Datei] -b oder Skript_PowerShell.ps1 -b -p [Datei]
In den Klammern [] muss zwingend ein Argument also der Pfad zu der Datei stehen.
Dieser muss mitgegeben werden.

Beim Schalter -a sollen die auszulesen Informationen an eine E-Mail gesendet werden, welche zusätzlich erst noch nach einer Abfrage eingetragen werden muss.
Wie kann ich diese E-Mail schon beim Aufruf mitgeben.
Wie müsste ich diesen Aufruf ändern, damit dies funktioniert?: [alias("A")][switch]$Admin


Hoffentlich kann dieser Eintrag anderen, welche auch auf der Suche nach dieser Information sind helfen.


Mit freundlichen Grüßen
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 28. August 2019 - 13:22

Schau mal in Richtung parametersets und das Parameterattribut selber. Bei ps fällt das unter Advanced Functions iirc.

Beispiel.
param
(
....
[parameter(mandatory=$true,parametersetname=“adminmode”)] #dieser Parameter ist jetzt überflüssig
[Alias(“a”)]
[switch]$Admin,

[parameter(mandatory=$true,parametersetname=“adminmode”)] #wird -Mail angegeben sind wir automatisch im Adminmode
[Validatescript({ $_ -match ...  })] #statt der ... den passenden Ausdruck von oben
[string]$Mail

...
)

Begin
{...}
Process{...}
End{...}

"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

#3 Mitglied ist offline   TheBlackDragon 

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

geschrieben 29. August 2019 - 08:18

Guten Morgen RalphS,

vielen Dank für die Info, diese Advanced Functions haben mir etwas weitergeholfen.

param(

[Parameter(Mandatory=$true,ParameterSetName=“help”)] #dieser Parameter ist jetzt überflüssig
[Alias(“h”)]
[switch]$Help,

[parameter(mandatory=$true,parametersetname=“adminmode”)] 
[Alias(“a”)]
[Validatescript({ $_ -match $maileingabe})]
[switch]$Admin

)


Der Aufruf des Skriptes mit Schalter -h funktioniert und die Hilfe wird ausgegeben.
Der Adminmode wird in diesem Skript mit dem Schalter -a aufgerufen, dass funktioniert ebenfalls.
Nur leider funktioniert der Aufruf mit skript.ps1 -a [email protected] nicht.

Beim Aufruf der Mail am Ende kommt diese Fehlermeldung:

Zitat

h:\__FACHARBEIT\test.ps1 -a [email protected]
H:\__FACHARBEIT\test.ps1 : Es wurde kein Positionsparameter gefunden, der das Argument "[email protected]" akzeptiert.
In Zeile:1 Zeichen:1
+ h:\__FACHARBEIT\test.ps1 -a [email protected]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [test.ps1], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,test.ps1


Was mach ich Falsch oder habe ich das falsch verstanden:

Zitat

[Validatescript({ $_ -match ... })] #statt der ... den passenden Ausdruck von oben


MfG
Alex
0

#4 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 29. August 2019 - 08:52

Der A Parameter ist nicht notwendig, wenn Du die Mailadresse nur für den Adminmodus verwendest.

Du kannst prinzipiell auch $Admin zu einem String machen. Das ist aber semantisch mißdeutig. In dem Fall vielleicht $AdminMail.

Wie der Parameter heißt ist am Ende egal. Was wichtig ist ist sein Verhalten.

Mit Parametersetname und Mandatory definierst Du über den Scriptaufruf, daß wenn der Parameter angegeben *wird, das Script im fraglichen Parameterset läuft. Hier der Adminmodus. Andere Parameter sind nicht mehr möglich, wenn man einmal den -Mailparameter angegeben hat. Ein weiterer Schalter -A leistet nichts, er ist redundant und kann weg AUßER Du willst noch Mailadressen in anderen Modi angeben können.
"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

#5 Mitglied ist offline   TheBlackDragon 

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

geschrieben 29. August 2019 - 09:30

Hey RalphS,

Ja, das Angeben von verschiedenen Mails in einem anderen Modi wie zb der Mailmodus ist noch notwendig.
Nur hierzu muss eine andere Mail angegeben werden als für den Adminmode.

Wie oben von mir beschrieben gibt es Situationen, in welchem das Skript mit zwei Parametern aufgerufen werden soll. Beispielsweise -c -b
Wenn man die Konfigurationsdatei vor dem Ausführen des Skriptes noch anpassen möchte oder ähnliches.

Natürlich soll der Parameter -c ebenfalls separat aufgerufen werden können.

Zitat

Desweiteren habe ich mich überlegt, dass mit dem Schalter -p eine Passwortdatei erstellt werden.
Skript_PowerShell.ps1 -p [Datei] -b oder Skript_PowerShell.ps1 -b -p [Datei]
In den Klammern [] muss zwingend ein Argument also der Pfad zu der Datei stehen.
Dieser muss mitgegeben werden.


Hierbei muss Beispielsweise eine Datei mit übergeben werden.

Könntest du mir bitte ein Beispiel nennen, was ich hier einzutragen habe. Verstehe das leider immer noch nicht so richtig :(

Zitat

[parameter(mandatory=$true,parametersetname=“adminmode”)]
[Alias(“a”)]
[Validatescript({ $_ -match $maileingabe})]
[switch]$Admin


Dies ist meine Umsetzung:
param(
[Parameter(Mandatory=$false,ParameterSetName=“help”)]
[Alias(“h”)]
[switch]$Help,

[parameter(mandatory=$true,ParameterSetName=“adminmode”)] 
#[Alias(“a”)]
#[string]$maileingabe,
[switch]$Admin
#[parameter(mandatory=$true,parametersetname=“adminmode”)] #wird -Mail angegeben sind wir automatisch im Adminmode
#[Validatescript({ $_ -match $maileingabe})] #statt der ... den passenden Ausdruck von oben
#[string]$maileingabe



Mit dem Schalter -a soll man in den Adminmode gelangen.
Die Ausgabe soll auf der Konsole stattfinden außer eine E-Mail wird mit angegeben.
Dies ist schon funktional. Es geht lediglich um den Aufruf.

Ich habe das Gefühl ich mach das ganz viel Falsch.


MfG
Alex

Dieser Beitrag wurde von TheBlackDragon bearbeitet: 29. August 2019 - 10:21

0

#6 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 29. August 2019 - 11:18

Wenn Mail nicht nur für den Adminmode da ist, laß Parametersetname und Mandatory für $Mail weg. Und wenn der Adminmode wirklich NUR über den Switchparameter definiert ist, kannst Du nach Laune den Parameter als Boolean verwenden oder einen Parametersatz definieren. Ich bin immer für den Satz, das ist später einfacher erweiterbar.

Validatescript verifiziert die Eingabe. Die steckt immer in $_. Da wir ja schon einen Regex für Mailadressen definiert hatten, können wir den hier nehmen und wissen dann, daß $mail eine syntaktisch korrekte Emailadresse ist.

Das ValidatesetAttribut ist aber wie alle anderen optional. Wenn Du damit nichts anfangen kannst, laß es einfach weg.

Und Parametersets sind Einheiten für bestimmte Funktionsmodi. Help und Admin soll jeweils möglich sein, aber nicht beides? Also jeweils ein Parameterset definieren.

Parameter, die keins definiert haben, gelten in allen, also global. Ist eigentlich recht einfach. Schau dazu auch mal nach Tutorials, gibts auch für die Sets.
"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

#7 Mitglied ist offline   TheBlackDragon 

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

geschrieben 03. September 2019 - 14:50

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 die ein oder andere Frage.


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

Dieser Beitrag wurde von TheBlackDragon bearbeitet: 05. September 2019 - 10:59

0

Thema verteilen:


Seite 1 von 1

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