none
@Peter wegen Proxy Commands RRS feed

  • Allgemeine Diskussion

  • Ja ich wusst nicht wie ich dich am besten kontaktieren konnte und die Frage darf ich jetzt ja nicht mehr posten (oder sollte ich vermeiden), da sie schon im englischen Forum steht.

    Auf jeden Fall hat sich die ganze Sache etwas geändert und es geht eigentlich nur um Funktionen mit gebundenen Parametern.

    Deswegen hier der Link zum englischen Thread: http://social.technet.microsoft.com/Forums/en-US/winserverpowershell/thread/71108c6b-3dc2-4593-8787-48702c5c4437

    Ich hab dich drum länger nicht mehr im englischen Forum schreiben gesehen, deshalb dachte ich, ich schau mal im deutschen vorbei, da hier die Fragen meistens schneller beantwortet werden (nämlich von dir :)).


    The following is my signature:

    Powershell Programmer & Advanced Lua Programmer

    Location: Switzerland

    Beside that, whenever you see a reply, you think is helpful, click "Vote As Helpful"! And whenever you see a reply being an answer to the main question of the thread, click "Mark As Answer" (if you opened the thread).

    I published the URL's for the icons in my signature.

    Please contact me, before reporting me, thank you.

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('577076797174-87661607769657424-8687168065964').substring(($_*2),2))})-replace' '

    Freitag, 8. März 2013 13:57

Alle Antworten

  • Das ist einen Technik die sich Splatting nennt!
    Man kann einem cmdlet die Parameter einzeln übergeben:

    Get-ChildItem -Path 'C:\Temp' -Recurse -ErrorAction stop

    oder man baut eine Hashtable die die Parameter enthält.
    Diese Hashtable wird dem Cmdlet übergeben und bei der Übergabe in seine Einzelteile zerlegt (expandiert).
    Wie ein Käfer, der an der Windschutzscheibe an einem fahrenden Auto zerspringt! Deshalb Splatting!

    $SplatMeHashTable = @{Path='C:\temp';Recurse=$True;ErrorAction='Stop'}
    
    # hashtable wird übergeben und in seine Parameter einzelteile zerlegt dabei
    Get-ChildItem @SplatMeHashTable

    Der Parameter-Binder der PowerShell erstellt innerhalb einer Funktion eine Variable $PSBoundParameters.
    Diese Variable enthält die erfolgreich gebundenen Parameter (nur diese nicht alle!).
    Diese Variable ist keine Hashtable sondern vom Typ: system.collections.generic.dictionary[[string],[System.Object]]

    Beispiel mit einer Proxy Funktion für das Cmdlet Read-Host das den Parameter ForeGroundColor hinzufügt ;-)

    # Begin of ProxyFunction for Cmdlet Read-Host
    Function Read-Host {
    [CmdletBinding()]
    param(
        [Parameter(Position=0, ValueFromRemainingArguments=$true)]
        [AllowNull()]
        [System.Object]
        ${Prompt},
        [Switch]
        ${AsSecureString},
    	[System.ConsoleColor]
        ${ForegroundColor}
    	)
    
    begin
    {
        try {
            
    		# alte Vordergrundfarbe retten
    		$OldColor = [console]::ForegroundColor
    		
            # Vordergrundfarbe setzen
            If ($ForegroundColor)
            {
             [console]::ForegroundColor = ${ForegroundColor}
            } $outBuffer = $null if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) { $PSBoundParameters['OutBuffer'] = 1 } $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Read-Host', [System.Management.Automation.CommandTypes]::Cmdlet) # in der Variable für die gebundenen Parameter $PSBoundParameters, ist der Parameter -ForegroundColor drin. # dieser muss für das Originale Cmdlet Read-Host aus dem Array entfernt werden! Sonnst gibt es einen Error! # die Variable $PSBoundParameters ist vom Typ system.collections.generic.dictionary[[string],[System.Object]] # so können wir die Remove() Methode benutzen $Null = $PSBoundParameters.remove('ForegroundColor') # Parameter ohne die ForegroundColor durch splatting übergeben $scriptCmd = {& $wrappedCmd @PSBoundParameters } $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin) $steppablePipeline.Begin($PSCmdlet) } catch { throw } } process { try { $steppablePipeline.Process($_) } catch { throw } } end { try { $steppablePipeline.End() } catch { throw } # Farbe zurücksetzen [console]::ForegroundColor = $OldColor } <# .ForwardHelpTargetName Read-Host .ForwardHelpCategory Cmdlet #> } # End ProxyFunction Read-Host # Test Read-Host 'Namen eingeben' -ForegroundColor DarkGreen # Hallo Welt müsste wieder Weiss sein! Write-Host "Hallo Welt!"
    Siehe auch:
    http://technet.microsoft.com/en-us/magazine/gg675931.aspx


    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!



    • Bearbeitet Peter Kriegel Dienstag, 12. März 2013 07:12 Code Bug entfernt
    Freitag, 8. März 2013 14:47
  • Ein Proxy Command ist eine Funktion die ein vorhandenes Cmdlet umhüllt und verdeckt.
    Statt des Cmdlets wird die Funktion mit dem selben Namen aufgerufen.
    Die Funktion ruft aber Intern das Original Cmdlet auf.
    Die Proxy Funktion  kann man selbst Erweitern oder Ändern.
    Dadurch bekommt ein Cmdlet neue oder ander Funktionen oder Parameter.

    Proxy Commands (Funktionen) kannst du ganz einfach so erstellen:

    Function New-ProxyCommand {
    	
    	[CmdletBinding()]
    	param (
    	[Parameter(Mandatory=$True,Position=0,ValueFromPipeline=$True,HelpMessage="Enter valid cmdlet name!")]
    	[ValidateScript({If(Get-Command $_ -CommandType 'Cmdlet' -ErrorAction SilentlyContinue){$True}Else{$False}})]
    	[String]$CmdletName
    	)
    	
    	Process {
    		
    		# Get the command
    		$Cmd = Get-Command $CmdletName
    		# Now get it's metadata
    		$CmdMetadata = New-Object System.Management.Automation.CommandMetaData $Cmd
    		
    		# Create our proxy command (function)
    		$OutText = "# Begin of ProxyFunction for Cmdlet $CmdletName`n"
    		$OutText += "Function $CmdletName {`n"
    		$OutText += ([System.Management.Automation.ProxyCommand]::Create($CmdMetadata)) + " `n"
    		$OutText += "} # End ProxyFunction $CmdletName"
    		
    		# Return Text of proxy command (function)
    		$OutText
    	}
    
    }
    
    New-ProxyCommand 'Read-Host'

    Warnung:
    Proxy Funktionen haben den Nachteil, dass eine Proxy Funktion nur eine ganz normale Funktion ist!
    Wenn ein anderes Modul oder ein User auch eine Proxy Funktion mit demselben Namen lädt oder erstellt, dann wird die schon existierende Funktion überschrieben! Der letzte gewinnt!
    Deshalb sollte man Proxy Funktionen möglichst wenig nutzen, oder die eventuell schon Vorhandenen Proxy Funktionen im ihrem Modul erweitern anstatt eine neue zu kreieren!


    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, 8. März 2013 15:38
  • Ich empfehle dir ganz ganz dringend das Buch von Bruce Payette zu lesen!
    Da stehen solche Sachen drin:

    Das Buch von Bruce Payette MUSS man haben, wenn man die PowerShell Internas besser kennenlernen will.
    Es ist meiner Meinung nach geeignet um PowerShell zu Lernen, aber für diesen Zweck nicht das beste.
    Wenn man sich mit der PowerShell schon etwas auskennt, öffnet diese Buch einen neuen Horizont.

    Deshalb ist es für fortgeschrittene eine Pflichtlektüre!

    Windows PowerShell in Action
    Autor: Bruce Payette
    Taschenbuch: 984 Seiten
    Verlag: Manning; Auflage: 2. Auflage. (2. Juni 2011)
    Sprache: Englisch
    ISBN-10: 1935182137
    ISBN-13: 978-1935182139

    Die 2. Auflage ist dicker und besser!



    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, 8. März 2013 15:40
  • Zwei Ergänzungen / Korrekturen:

     

    Den Satz „Deshalb sollte man Proxy Funktionen möglichst wenig nutzen, oder die eventuell schon Vorhandenen Proxy Funktionen im ihrem Modul erweitern anstatt eine neue zu kreieren!“ möchte ich so ungern stehen lassen. Oft sind Proxy cmdlets die einzige Möglichkeit, ein bestimmtes Ziel zu erreichen, siehe [PSLos http://gallery.technet.microsoft.com/scriptcenter/PSLog-Send-messages-to-a-db389927]. Wenn der Zugriff auf den Code nicht gegeben ist bzw. ich diesen nicht ändern darf, muß ich ihn verpacken.

     

    Write-Host
    PSLog\Write-Host
    Pipeworks\Write-Host
    Microsoft.PowerShell.Utility\Write-Host

    Wenn tatsächlich die Gefahr von Kollisionen entsteht, kann man diese durch die Angabe des Moduls beim ausführen des Kommandos lösen oder muß darauf achten, daß entsprechende Modul noch einmal nachzuladen.

     

    Das Buch von Bruce Payette habe ich nicht gelesen, wohl aber gehört, daß es gut ist.


    -Raimund

    Freitag, 8. März 2013 19:25
  • @Raimund vielen Dank für die gute Ergänzung! Hilfreich UP!

    Sicher kann man manche sachen nicht ohne Proxy Commands erledigen.

    Seit Jeffrey Snover die Proxy Commands vorgestellt hat, sehe ich teilweise eine Inflationäre nutzung von gerade dem Out-Default Cmdlet.

    Bei Namens-Kollisionen und der nutzung von Modulpfaden verliert man dann den Vorteil der Namensgleichheit!
    Wenn man ein Namensgleiches Proxy Command erstellt, hat man ja die Absicht das der User einfach ohne nachdenken das neu Kommando aufruft, anstatt des Original Kommandos!

    Das nutzen von Modulpfade muss also bewusst geschehen und macht die Namensgleichheit sinnlos!

    Ohne nutzung von Modulpfaden, kann es dann Passieren, das nicht das erwartet Proxy Command aufgerufen wird, sondern ein anderes Namensgleiches.
    Dies führt zu unerwarteten Ergebnissen!
    Deshalb muss jedem bewusst sein, das es nicht garantiert ist, das SEIN Namensgleiches Proxy Command ausgeführt wird!

    Hier möchte ich noch ergänzen, das man dann in Erwägung ziehen sollte, KEINE Namensgleichheit zu benutzen! Das Obige Proxy Command Read-Host, hätte dann, bei gleicher Funktionalität, auch Read-ColoredHost benannt werden können! Dies stellt sicher das dieses ausgeführt wird, bis jemand anderes auch auf die Idee kommt eine zufällig namensgleiche Funktion zu schreiben. ;-))


    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!

    Samstag, 9. März 2013 11:37
  • Es scheint als wurde mir wohl ein wenig falsch weiter geholfen mit den Proxy-Commands. Ich muss das jetzt erst alles mal durchlesen und nachlesen (was ich noch nicht kenne), das sieht auf den ersten Blick sehr kompliziert aus. Ich meld mich wenn ich mal durch bin.

    The following is my signature:

    Powershell Programmer & Advanced Lua Programmer

    Location: Switzerland

    Beside that, whenever you see a reply, you think is helpful, click "Vote As Helpful"! And whenever you see a reply being an answer to the main question of the thread, click "Mark As Answer" (if you opened the thread).

    I published the URL's for the icons in my signature.

    Please contact me, before reporting me, thank you.

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('577076797174-87661607769657424-8687168065964').substring(($_*2),2))})-replace' '

    Montag, 11. März 2013 07:34
  • Hab soweit dein Script einmal ausgetestet, soweit ist alles abgelaufen, wie ich es mir vorgestellt habe. Und zwar dass das CmdLet OHNE -ForeGroundColor nicht mehr funktioniert, was es aber sollte (wenn es möglich ist).

    Mein Ziel:

    Das CmdLet Read-Host sollte zusätzlich einen Parameter erhalten, welchen man angeben KANN (damit etwas passiert) aber NICHT MUSS (wird dementsprechend auch nichts passieren).

    Ich verstehe auch noch nicht so ganz, warum du am Anfang auch den AsSecureString Switch nochmal erwähnst. Was wäre den mit den CommonParameters?

    Ich habe mir drum etwa so was gedacht:

    If ($ForeGroundColor)
    {
    #Nur dann wird die Farbänderung durchgeführt
    }


    The following is my signature:

    Powershell Programmer & Advanced Lua Programmer

    Location: Switzerland

    Beside that, whenever you see a reply, you think is helpful, click "Vote As Helpful"! And whenever you see a reply being an answer to the main question of the thread, click "Mark As Answer" (if you opened the thread).

    I published the URL's for the icons in my signature.

    Please contact me, before reporting me, thank you.

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('577076797174-87661607769657424-8687168065964').substring(($_*2),2))})-replace' '


    Montag, 11. März 2013 08:06
  • Sowas hier sieht verdächtig aus:

    ps.Properties.Add(new PSNoteProperty("MaxBandwidthMB", site.Limits.MaxBandwidth / 1024));

    Das hab ich von der folgenden Seite, wo ein CmdLet aufgebaut wird:

    http://www.codeproject.com/Articles/20867/Build-a-PowerShell-cmdlet


    The following is my signature:

    Powershell Programmer & Advanced Lua Programmer

    Location: Switzerland

    Beside that, whenever you see a reply, you think is helpful, click "Vote As Helpful"! And whenever you see a reply being an answer to the main question of the thread, click "Mark As Answer" (if you opened the thread).

    I published the URL's for the icons in my signature.

    Please contact me, before reporting me, thank you.

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('577076797174-87661607769657424-8687168065964').substring(($_*2),2))})-replace' '

    Montag, 11. März 2013 08:22
  • Endlich funktionierts wieder.... konnte gerade lange nichts schreiben, weil ich wieder einmal MigrationUser0 war. -.-

    Das Problem liegt hier:

    [System.ConsoleColor]
    ${ForegroundColor}

    Ist ziemlich zu Beginn des Scripts. Da, wenn ich ja nichts eingebe, NULL nicht in eine Konsolen-Farbe konvertiert werden kann, funktionierts gleich nicht mehr.

    The following is my signature:

    Powershell Programmer & Advanced Lua Programmer

    Location: Switzerland

    Beside that, whenever you see a reply, you think is helpful, click "Vote As Helpful"! And whenever you see a reply being an answer to the main question of the thread, click "Mark As Answer" (if you opened the thread).

    I published the URL's for the icons in my signature.

    Please contact me, before reporting me, thank you.

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('577076797174-87661607769657424-8687168065964').substring(($_*2),2))})-replace' '


    Montag, 11. März 2013 09:28
  • Also somit funktioniert alles soweit:

    # Begin of ProxyFunction for Cmdlet Read-Host
    Function Read-Host {
    [CmdletBinding()]
    param(
        [Parameter(Position=0, ValueFromRemainingArguments=$true)]
        [AllowNull()]
        [System.Object]
        ${Prompt},
        [Switch]
        ${AsSecureString},
    	[string]
        ${ForegroundColor}
    	)
    
    begin
    {
        try {
            
    		# alte Vordergrundfarbe retten
    		$OldColor = [console]::ForegroundColor
    		
    		# Vordergrundfarbe setzen
            If ($ForegroundColor)
            {
    		[console]::ForegroundColor = ${ForegroundColor}
            }
    		
    		$outBuffer = $null
            if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
            {
                $PSBoundParameters['OutBuffer'] = 1
            }
            $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Read-Host', [System.Management.Automation.CommandTypes]::Cmdlet)
    		
    		# in der Variable für die gebundenen Parameter $PSBoundParameters, ist der Parameter -ForegroundColor drin.
    		# dieser muss für das Originale Cmdlet Read-Host aus dem Array entfernt werden! Sonnst gibt es einen Error!
    		# die Variable $PSBoundParameters ist vom Typ system.collections.generic.dictionary[[string],[System.Object]]
    		# so können wir die Remove() Methode benutzen
    		$Null = $PSBoundParameters.remove('ForegroundColor')
    	# Parameter ohne die ForegroundColor durch splatting übergeben	
            $scriptCmd = {& $wrappedCmd @PSBoundParameters }
            $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
            $steppablePipeline.Begin($PSCmdlet)
        } catch {
            throw
        }
    	
    }
    
    process
    {
    	try {
            $steppablePipeline.Process($_)
        } catch {
            throw
        }
    }
    
    end
    {
        try {
            $steppablePipeline.End()
        } catch {
            throw
        }
    	
    	# Farbe zurücksetzen
    	[console]::ForegroundColor = $OldColor
    }
    <#
    
    .ForwardHelpTargetName Read-Host
    .ForwardHelpCategory Cmdlet
    
    #>
     
    } # End ProxyFunction Read-Host

    Eventuell kennst du ja jedoch doch noch eine bessere Methode, dies zu tun?

    The following is my signature:

    Powershell Programmer & Advanced Lua Programmer

    Location: Switzerland

    Beside that, whenever you see a reply, you think is helpful, click "Vote As Helpful"! And whenever you see a reply being an answer to the main question of the thread, click "Mark As Answer" (if you opened the thread).

    I published the URL's for the icons in my signature.

    Please contact me, before reporting me, thank you.

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('577076797174-87661607769657424-8687168065964').substring(($_*2),2))})-replace' '

    Montag, 11. März 2013 09:34
  • Was mich vorallem intressiert, warum hast du folgende Zeile eingefügt zu Beginn?

        [Switch]
        ${AsSecureString},
    

    Bei mir geht -AsSecureString auch ohne diese Zeile. Gibt's da nen bestimmten Grund? Danke für deine Hilfe. :)

    The following is my signature:

    Powershell Programmer & Advanced Lua Programmer

    Location: Switzerland

    Beside that, whenever you see a reply, you think is helpful, click "Vote As Helpful"! And whenever you see a reply being an answer to the main question of the thread, click "Mark As Answer" (if you opened the thread).

    I published the URL's for the icons in my signature.

    Please contact me, before reporting me, thank you.

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('577076797174-87661607769657424-8687168065964').substring(($_*2),2))})-replace' '

    Montag, 11. März 2013 09:36
  • Wenns keine bessere Möglichkeit gibt, kannst du sonst deinen Skript im englischen Forum posten, damit ich die Antwort markieren kann, schliesslich hast du ja die Lösung gebracht.

    The following is my signature:

    Powershell Programmer & Advanced Lua Programmer

    Location: Switzerland

    Beside that, whenever you see a reply, you think is helpful, click "Vote As Helpful"! And whenever you see a reply being an answer to the main question of the thread, click "Mark As Answer" (if you opened the thread).

    I published the URL's for the icons in my signature.

    Please contact me, before reporting me, thank you.

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('577076797174-87661607769657424-8687168065964').substring(($_*2),2))})-replace' '

    Montag, 11. März 2013 09:41
  • Die für mich bisher unverständliche Stellen (Dinge die ich noch nicht weiss wofür sie genau da sind):

    Zwar ist mir hier klar, dass die Parameter bestummen werden, die verwendet werden können für die Funktionen, jedoch verstehe ich den Inhalt nicht so ganz, bzw. den Aufbau. [Switch] und [System.ConsoleColor] habe ich sowei auch begriffen.

    param(
        [Parameter(Position=0, ValueFromRemainingArguments=$true)]
        [AllowNull()]
        [System.Object]
        ${Prompt},
        [Switch]
        ${AsSecureString},
    	[System.ConsoleColor]
        ${ForegroundColor}
    	)
    

    Ich hab leider noch nie was vom OutBuffer gehört, in Google habe ich da etwas über die CommonParameters erfahren, ist für mich aber trotzdem unverständlich. Das einzige was ich verstehe, ist, dass $wrappedCmd schlussendlich Read-Host als cmdlet ist, jedoch komme ich beim deklarieren nicht ganz klar, was damit gemeint ist.

    		$outBuffer = $null
            if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
            {
                $PSBoundParameters['OutBuffer'] = 1
            }
            $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Read-Host', [System.Management.Automation.CommandTypes]::Cmdlet)
    

    Das mit dem steppablePipeline verstehe ich ebenfalls nicht. Das scheint für mich der Ablauf des cmdlet's zu sein, da man ja Beginn, Process oder End verändern kann. Trotzdem verstehe ich auch hier den Aufbau nicht so ganz.

            $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
            $steppablePipeline.Begin($PSCmdlet)
    

    Ich schaue weiterhin nach, was sich so in Google darüber finden lässt und sage natürlich Bescheid, wenn ich etwas begriffen haben sollte.

    The following is my signature:

    Powershell Programmer & Advanced Lua Programmer

    Location: Switzerland

    Beside that, whenever you see a reply, you think is helpful, click "Vote As Helpful"! And whenever you see a reply being an answer to the main question of the thread, click "Mark As Answer" (if you opened the thread).

    I published the URL's for the icons in my signature.

    Please contact me, before reporting me, thank you.

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('577076797174-87661607769657424-8687168065964').substring(($_*2),2))})-replace' '

    Montag, 11. März 2013 11:39
  • Genau richtig ! Ich hatte vergessen das If ($ForegroundColor) zu testen!

    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!

    Montag, 11. März 2013 13:20
  • Ein Proxy Command ist eine Funktion mit der Aufgabe EIN vorhandenes Cmdlet oder EINE Vorhandene Funktion aufzurufen.
    (Ich werde im Folgenden von Proxy Funktion anstatt von Proxy Command reden, das trifft es besser!)

    Die Proxy Funktion "umhüllt" ein schon  vorhandenes Cmdlet oder eine vorhanden Funktion (wrapper).
    Die Proxy Funktion ruft Intern das Original Cmdlet oder Funktion auf.
    Die Proxy Funktion agiert also Stellvertretend für das Originale ursprüngliche Kommando.


    Eine Proxy Funktion hat meistens die gleichen Parameter wie das umhüllte Kommando!
    Dies muss aber nicht so sein!
    Wenn die Proxy Funktion internen das umhüllte Kommando aufruft,
    werden die Parameter der Äußeren Proxy Funktion an die Parameter des inneren Kommando weitergegeben.

    Beim Aufruf der Proxy Funktion wird vom PowerShell Parameterbinder die Variable mit dem Namen $PSBoundParameters erstellt.
    Diese Variable enthält alle Parameter die vom Parameterbinder beim Aufruf der Proxy Funktion gebunden werden konnten.
    Damit eine Namensgleiche Proxy Funktion zu 100% rückwärtskompatibel zu dem umhüllten Kommando ist,
    muss das Parameter Interface der Proxy Funktion identisch zu dem umhüllten Kommando sein!
    Alle Parameter müssen gleich sein!
    Ebenso muss der Rückgabewert (das Ergebnis) vom gleichen Typ sein.

    Wenn alle Parameter der Proxy Funktion mit dem umhüllten Kommando gleich sind,
    können die Parameter sehr leicht mit der Variablen $PSBoundParameters an das umhüllten Kommando übergeben werden.
    Dies geschieht mit der so genannten in PowerShell vorhandenen Splatting Technik.

    Wenn die Proxy Funktion neue Parameter hinzufügt oder  weglässt, kann es vorkommen, dass es bei Nutzung dieser Parameter zu Aufruf-Fehlern kommt!

    Deshalb ist in meiner Read-Host Proxy Command der Parameter ${AsSecureString} vorhanden.
    Das Originale Cmdlet hat auch diesen Parameter!
    Die Parameter sind, ausser dem neu zugefügten Parameter -ForegroundColor, Identisch zu dem Originalen Read-Host Cmdlet!

    Bevor dem Originalen Read-Host Cmdlet die Parameter mit hilfe der $PSBoundParameters übergeben werden kann muss der Parameter -ForegroundColor aus der Variablen entfernt werden!

    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!

    Montag, 11. März 2013 13:34
  • Danke Peter,

    Das was du soweit jetzt getextet hast, habe ich vorhin schon verstanden (ausser das mit dem AsSecureString habe ich erst jetzt begriffen).

    Ich mache so ähnliches auch mit dem Write-Host (versuche es auf jeden Fall), dabei habe ich gerade kürzlich erfahren, dass das genau bei dem cmdlet etwas anders abläuft. Das könnte der Grund sein, warum das nicht so auf einen Klacks geht.

    Ich werde deinen Post im englischen Thread als Antwort markieren und zusätzlich den schlussendlich funktionierenden Skript posten.


    The following is my signature:

    Powershell Programmer & Advanced Lua Programmer

    Location: Switzerland

    Beside that, whenever you see a reply, you think is helpful, click "Vote As Helpful"! And whenever you see a reply being an answer to the main question of the thread, click "Mark As Answer" (if you opened the thread).

    I published the URL's for the icons in my signature.

    Please contact me, before reporting me, thank you.

    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('577076797174-87661607769657424-8687168065964').substring(($_*2),2))})-replace' '

    Montag, 11. März 2013 13:42
  • Das Cmdlet heisst Read-Host!
    Ein Host z.B. das Konsolenfenster hat Eingabe-Puffer (StdIn), Ausgabe-Puffer (StdOut) und den Error-Puffer (StdErr).
    Dies sind Speicherbereiche im RAM mit einer vorher vereinbarten Größe. Diese Puffer können Prozess-übergreifend genutzt werden.
    Ein Windows Prozess legt seine Ausgaben in den Ausgabe Puffer, dort kann ein nachfolgender Prozess diese Daten abholen.
    Ebenso geht das mit den anderen Puffern.

    Da ich auch keine Dokumentation gefunden habe vermute ich mal:

    Windows selbst ist in C oder C++ Programmiert. Deshalb holt sich die PowerShell die Adresse des Out-Puffers mit [ref]$outBuffer.
    Wenn dies auftaucht kannst du das also Ignorieren!
    Bloss nicht verändern, sonnst hast du keinen Ausgabe-Puffer! ;-)
    $PSBoundParameters['OutBuffer'] = 1 ; # heisst dann das ein Ausgabe Puffer vorhanden ist
    Oder:
    In den Common Parameters kannst du eine Variable festlegen in die die Ausgabe gelegt wird Parameter: -OutVariable
    Dieser könnte auch als OutBuffer gemeint sein. Die Speicheradresse würde dann auf die Variable zeigen und nicht auf den Standard mäßig vorhandenen StdOut-Puffer.
    Diese Vermutung liegt näher als die erste.


    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!

    Montag, 11. März 2013 13:52