none
Powershell: Sprungmarke RRS feed

  • Frage

  • Hallo, soweit ich es verstanden habe, gibt es keine Srungmarken im Powershell. Wie könnte ich folgende Aufgabe lösen:

    Damit mein Script seine Arbeit erledigen kann, benötigt es drei Informationen. Diese Infos frage ich in der aktuellen Version den Benutzer. Nun möchte ich aber auch eine schnellere Möglichkeit anbieten. Und zwar möchte ich die Infos bereits beim Aufruf des Scriptes übergeben können.

    Soweit bin ich schon:

    ---------------------------------------------------

    $i = ($args).count
    If ($i -eq 3) {
    Write-Host -Fore "Red" "Es wurde nicht die Richtige Zahl von Parametern übergeben. Es wurde " $i "Argumente übergeben."
    }

    #Parameter übergeben
    $argument1 = $args[0]
    $argument2 = $args[1]
    $argument2 = $args[2]

    ---------------------------------------------------

    Bei der Eingabe der Daten nach Abfrage überprüfe ich sofort ob die Eingabe richtig ist:

    ---------------------------------------------------

    # Abfrage des Benutzernamen
    do {
     $Benutzername = Read-Host "Bitte geben Sie Ihren Benutzernamen ein:"
     $ChkFile = "C:\Users" + "\" + $Benutzername
     if ($FileExists = (Test-Path $ChkFile)) {
        # Eingabe stimmt, nicht weiter fragen:
        $nachfragen = $false
    } else {
        # Eingabe stimmt nicht, Hinweis ausgeben und weiter nachfragen:
        Write-Host -Fore "Red" "Benutzername ist nicht vorhanden."
        $nachfrageN = $true
     }
    } while ($nachfragen)

    ---------------------------------------------------

    Im Prinzip möchte ich die beim Script aufruf übergebenen Daten überprüfen und wenn sie nicht richtig sind auf die manuelle Abfrage wechseln. Und wenn sie richtig sind, dann soll das Script mit der eigentlichen Aufgabe starten. Wären vielleicht zwei Scripte die Lösung? Script eins prüft oder fragt Daten ab und startet dann das zweite Script?


    IT Berater

    Freitag, 22. Februar 2013 06:32

Antworten

  • Wenn ich das noch etwas erweitern darf:

    Das überprüfen der Argumente sollte man mit der Definition des Parameters machen. Hierzu liefert die PowerShell diverse Validate Patterns mit. In einem Script Read-Host zu verwenden, halte ich für problematisch, da es dann nur noch interaktiv verwendet werden kann. Besonders stört mich an solchen Scripts, daß man sie nicht über die Historie noch einmal aufrufen kann, weil man immer weitere Dinge angeben muß.

     

    Das folgende Script zeigt alle Validierungsmöglichkeiten auf. ValidateScript ist am flexibelsten und kann auch benutzt werden, um z.B. einen Benutzernamen im AD zu validieren oder die Existenz eines Orders.

    <#
    .SYNOPSIS
    	This function shows the usage of Parameter Validation Attributes.
    	
    .DESCRIPTION
    	Parameter validation attributes direct Windows PowerShell to test the 
    	parameter values that users submit when they call the advanced function.
    	If the parameter values fail the test, an error is generated and the 
    	function is not called.
    	
    	This script demonstrates the use of
    	- ValidateCount
    	- ValidateLength
    	- ValidatePattern
    	- ValidateRange
    	- ValidateScript
    	- ValidateSet
    	- ValidateNotNullOrEmpty
    	The following options are not covered
    	- AllowNull
    	- AllowEmptyString
    	- AllowEmptyCollection
    	- ValidateNotNull
    	
    .LINK
    	Further documention can be found using the cmdlet
    		Get-Help about_Functions_Advanced_Parameters
    		
    	or on Microsoft.com
    	
    	Examples of Cmdlet Code
    		http://msdn.microsoft.com/en-us/library/dd878287(VS.85).aspx
    	about_Functions_Advanced_Parameters
    		http://technet.microsoft.com/en-us/library/dd347600.aspx
    		
    .PARAMETER FirstName
    	Must be a string, is mandatory and must not be null or empty
    .PARAMETER LastName
    	Must be a string, is mandatory and must not be null or empty
    .PARAMETER Domain  
    	Some domain name that exists in the current forest.
    .PARAMETER LogonName  
    	Must be a string, must be at least two character and maximum 20
    .PARAMETER EmailAddress
    	Must be a string and a valid email address
    .PARAMETER Age
    	Must be an integer between 16 and 150
    .PARAMETER EmployeeType
    	Must be a string of the following values
    		- Temp
    		- Vendor
    		- Intern
    #>
    param
    (
    	[Parameter(Position = 0, Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
    	[string]$FirstName,
    	
    	[Parameter(Position = 1, Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
    	[string]$LastName,
    	
    	[Parameter(Position = 2)]
    	[ValidateScript({
    		$domainFound = $false
    		$f = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
    		foreach ($d in $f.Domains)
    		{
    			if ($d.GetDirectoryEntry().Name -eq $_)
    			{
    				$domainFound = $true
    			}
    		}
    		if (!$domainFound)
    		{
    			Write-Host "The domain could not be found in the forest." -ForegroundColor Red -BackgroundColor Yellow
    		}
    		$domainFound
    	})]		
    	[string]$Domain,
    	
    	[Parameter(Position = 3)]
    	[ValidateLength(2, 20)]		
    	[string]$LogonName,
    	
    	[Parameter(Position = 4)]
    	[ValidatePattern('^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$')]		
    	[string]$EmailAddress,
    	
    	[Parameter(Position = 5)]
    	[ValidateRange(16, 150)]		
    	[int]$Age,
    	
    	[Parameter(Position = 6)]
    	[ValidateCount(2, 2)]
    	[string[]]$Groups,
    	
    	[Parameter(Position = 7)]
    	[ValidateSet("Temp", "Vendor", "Intern")]
    	[string]$EmployeeType
    )
    begin
    { }
    process
    {
    	$MyInvocation.BoundParameters | Format-Table -AutoSize
    }
    end
    { }


    -Raimund

    Freitag, 22. Februar 2013 19:11
  • In PowerShell gibt es keine Sprungmarken (Label). Dafür bietet PowerShell eine bessere Möglichkeit zur Steuerung des Ablaufes durch Funktionen.

    PowerShell bietet schon eine sehr gute eingebaute Möglichkeit Parameter zu definieren und zu überprüfen!
    Siehe: http://technet.microsoft.com/de-de/library/dd347600.aspx

    Wenn du Englisch kannst, dann lies mal das hier:
    http://technet.microsoft.com/en-us/magazine/jj554301.aspx

    Und hier herunterscrollen zu Überschrift:
    Powershell und Funktionen und Parameter
    http://msexchangefaq.de/code/powershell/powershell.htm

    Beispiel:

    # Funktion definieren

    Function Test { [CmdletBinding()] param( [Parameter(Mandatory=$True,Position=0, HelpMessage='Bitte Benutzername eingeben!')] [ValidateScript({$_ -eq 'Peter'})] [String]$Benutzername ) } # Funktion aufrufen Test

    oder so:

    # Funktion definieren

    Function Test { [CmdletBinding()] param( [Parameter(Mandatory=$True,Position=0, HelpMessage='Bitte Benutzername eingeben!')] [ValidateNotNullOrEmpty()] [String]$Benutzername, [Parameter(Mandatory=$True,Position=1, HelpMessage='Einen gültigen Pfad zu einem Ordner angeben!')] [ValidateNotNullOrEmpty()] [String]$Path, [Parameter(Mandatory=$True,Position=2, HelpMessage='Eine Zahl zwischen 5 und 10 eingeben!')] $Count ) while(-Not ($Benutzername -eq 'Peter')) { $Benutzername = Read-Host "Benutzername war Falsch!`nBitte Benutzername eingeben! (A zum Abbrechen!)" # while schleife verlassen wenn a oder A gedrückt wurde If($Benutzername -eq 'a') {break} } while(-Not (Test-Path $Path)) { $Path = Read-Host "Den Pfad $Path gibt es nicht!`nBitte richtigen Pfad eingeben! (A zum Abbrechen!)" # while schleife verlassen wenn a oder A gedrückt wurde If($Path -eq 'a') {break} } while(($Count -lt 5) -or ($Count -gt 10)) { $Antwort = Read-Host "Die Zahl $Count war Falsch!`nBitte Zahl zwischen 5 und 10 eingeben! (A zum Abbrechen!)" # while schleife verlassen wenn a oder A gedrückt wurde If($Antwort -eq 'A') {break} #Fehlerabfangen wenn Buchstaben in eine Zahl gewandelt werden Try { $Count = [Int]$Antwort } Catch { # Count auf 0 setzen $Count = 0 } } "Benutzername ist: $Benutzername" "Der Pfad ist: $Path" "Die Zahl ist: $Count" } # Funktion aufrufen Test

    PowerShell Buch empfehlung siehe hier in der mitte des Threads
    http://social.technet.microsoft.com/Forums/de-DE/powershell_de/thread/84727252-3d5d-459e-b3a8-73a15807a807

    Kostenlose PowerShell Informationen (Workshop, E-Books) findest du hier:
    http://www.admin-source.de/BlogDeu/kostenlose-powershell-ebook-tutorial-workshop-howto


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Freitag, 22. Februar 2013 09:40

Alle Antworten

  • In PowerShell gibt es keine Sprungmarken (Label). Dafür bietet PowerShell eine bessere Möglichkeit zur Steuerung des Ablaufes durch Funktionen.

    PowerShell bietet schon eine sehr gute eingebaute Möglichkeit Parameter zu definieren und zu überprüfen!
    Siehe: http://technet.microsoft.com/de-de/library/dd347600.aspx

    Wenn du Englisch kannst, dann lies mal das hier:
    http://technet.microsoft.com/en-us/magazine/jj554301.aspx

    Und hier herunterscrollen zu Überschrift:
    Powershell und Funktionen und Parameter
    http://msexchangefaq.de/code/powershell/powershell.htm

    Beispiel:

    # Funktion definieren

    Function Test { [CmdletBinding()] param( [Parameter(Mandatory=$True,Position=0, HelpMessage='Bitte Benutzername eingeben!')] [ValidateScript({$_ -eq 'Peter'})] [String]$Benutzername ) } # Funktion aufrufen Test

    oder so:

    # Funktion definieren

    Function Test { [CmdletBinding()] param( [Parameter(Mandatory=$True,Position=0, HelpMessage='Bitte Benutzername eingeben!')] [ValidateNotNullOrEmpty()] [String]$Benutzername, [Parameter(Mandatory=$True,Position=1, HelpMessage='Einen gültigen Pfad zu einem Ordner angeben!')] [ValidateNotNullOrEmpty()] [String]$Path, [Parameter(Mandatory=$True,Position=2, HelpMessage='Eine Zahl zwischen 5 und 10 eingeben!')] $Count ) while(-Not ($Benutzername -eq 'Peter')) { $Benutzername = Read-Host "Benutzername war Falsch!`nBitte Benutzername eingeben! (A zum Abbrechen!)" # while schleife verlassen wenn a oder A gedrückt wurde If($Benutzername -eq 'a') {break} } while(-Not (Test-Path $Path)) { $Path = Read-Host "Den Pfad $Path gibt es nicht!`nBitte richtigen Pfad eingeben! (A zum Abbrechen!)" # while schleife verlassen wenn a oder A gedrückt wurde If($Path -eq 'a') {break} } while(($Count -lt 5) -or ($Count -gt 10)) { $Antwort = Read-Host "Die Zahl $Count war Falsch!`nBitte Zahl zwischen 5 und 10 eingeben! (A zum Abbrechen!)" # while schleife verlassen wenn a oder A gedrückt wurde If($Antwort -eq 'A') {break} #Fehlerabfangen wenn Buchstaben in eine Zahl gewandelt werden Try { $Count = [Int]$Antwort } Catch { # Count auf 0 setzen $Count = 0 } } "Benutzername ist: $Benutzername" "Der Pfad ist: $Path" "Die Zahl ist: $Count" } # Funktion aufrufen Test

    PowerShell Buch empfehlung siehe hier in der mitte des Threads
    http://social.technet.microsoft.com/Forums/de-DE/powershell_de/thread/84727252-3d5d-459e-b3a8-73a15807a807

    Kostenlose PowerShell Informationen (Workshop, E-Books) findest du hier:
    http://www.admin-source.de/BlogDeu/kostenlose-powershell-ebook-tutorial-workshop-howto


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Freitag, 22. Februar 2013 09:40
  • Wenn ich das noch etwas erweitern darf:

    Das überprüfen der Argumente sollte man mit der Definition des Parameters machen. Hierzu liefert die PowerShell diverse Validate Patterns mit. In einem Script Read-Host zu verwenden, halte ich für problematisch, da es dann nur noch interaktiv verwendet werden kann. Besonders stört mich an solchen Scripts, daß man sie nicht über die Historie noch einmal aufrufen kann, weil man immer weitere Dinge angeben muß.

     

    Das folgende Script zeigt alle Validierungsmöglichkeiten auf. ValidateScript ist am flexibelsten und kann auch benutzt werden, um z.B. einen Benutzernamen im AD zu validieren oder die Existenz eines Orders.

    <#
    .SYNOPSIS
    	This function shows the usage of Parameter Validation Attributes.
    	
    .DESCRIPTION
    	Parameter validation attributes direct Windows PowerShell to test the 
    	parameter values that users submit when they call the advanced function.
    	If the parameter values fail the test, an error is generated and the 
    	function is not called.
    	
    	This script demonstrates the use of
    	- ValidateCount
    	- ValidateLength
    	- ValidatePattern
    	- ValidateRange
    	- ValidateScript
    	- ValidateSet
    	- ValidateNotNullOrEmpty
    	The following options are not covered
    	- AllowNull
    	- AllowEmptyString
    	- AllowEmptyCollection
    	- ValidateNotNull
    	
    .LINK
    	Further documention can be found using the cmdlet
    		Get-Help about_Functions_Advanced_Parameters
    		
    	or on Microsoft.com
    	
    	Examples of Cmdlet Code
    		http://msdn.microsoft.com/en-us/library/dd878287(VS.85).aspx
    	about_Functions_Advanced_Parameters
    		http://technet.microsoft.com/en-us/library/dd347600.aspx
    		
    .PARAMETER FirstName
    	Must be a string, is mandatory and must not be null or empty
    .PARAMETER LastName
    	Must be a string, is mandatory and must not be null or empty
    .PARAMETER Domain  
    	Some domain name that exists in the current forest.
    .PARAMETER LogonName  
    	Must be a string, must be at least two character and maximum 20
    .PARAMETER EmailAddress
    	Must be a string and a valid email address
    .PARAMETER Age
    	Must be an integer between 16 and 150
    .PARAMETER EmployeeType
    	Must be a string of the following values
    		- Temp
    		- Vendor
    		- Intern
    #>
    param
    (
    	[Parameter(Position = 0, Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
    	[string]$FirstName,
    	
    	[Parameter(Position = 1, Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
    	[string]$LastName,
    	
    	[Parameter(Position = 2)]
    	[ValidateScript({
    		$domainFound = $false
    		$f = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
    		foreach ($d in $f.Domains)
    		{
    			if ($d.GetDirectoryEntry().Name -eq $_)
    			{
    				$domainFound = $true
    			}
    		}
    		if (!$domainFound)
    		{
    			Write-Host "The domain could not be found in the forest." -ForegroundColor Red -BackgroundColor Yellow
    		}
    		$domainFound
    	})]		
    	[string]$Domain,
    	
    	[Parameter(Position = 3)]
    	[ValidateLength(2, 20)]		
    	[string]$LogonName,
    	
    	[Parameter(Position = 4)]
    	[ValidatePattern('^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$')]		
    	[string]$EmailAddress,
    	
    	[Parameter(Position = 5)]
    	[ValidateRange(16, 150)]		
    	[int]$Age,
    	
    	[Parameter(Position = 6)]
    	[ValidateCount(2, 2)]
    	[string[]]$Groups,
    	
    	[Parameter(Position = 7)]
    	[ValidateSet("Temp", "Vendor", "Intern")]
    	[string]$EmployeeType
    )
    begin
    { }
    process
    {
    	$MyInvocation.BoundParameters | Format-Table -AutoSize
    }
    end
    { }


    -Raimund

    Freitag, 22. Februar 2013 19:11
  • Ich häng mich mal rein: Mir hat's geholfen. Danke!
    Montag, 25. Februar 2013 17:05