2014-08-29 13 views
6

Hier ist der Code, der das Problem veranschaulicht. Das Cmdlet Set-Location hat den dynamischen Schalter ReadOnly, wenn der Anbieter FileSystem ist.Dynamische Schalter vor Positionsparametern funktionieren möglicherweise nicht wie erwartet

# provider that does not have the dynamic -ReadOnly 
Set-Location env: 

# case 1: works because we explicitly specify FileSystem 
Get-ChildItem C:\ -ReadOnly 

# case 2: fails even though we explicitly specify FileSystem 
Get-ChildItem -ReadOnly C:\ 

Normalerweise Stellung eines Schalters Parameter in einem Befehl keine Rolle spielt. Dies ist nicht der Fall für einen dynamischen Schalter. Der Fall 2 schlägt mit dem Fehler fehl:

Get-ChildItem : A parameter cannot be found that matches parameter name 'ReadOnly'. 

Was passiert? Ich denke, dass im Moment der dynamischen Parametererstellung noch nicht bekannt ist, dass ReadOnly der Schalter ist. Daher behandelt PowerShell es als regulären Parameter mit seinem Argument C:\ und C:\ daher wird nicht als ein Positionsparameter behandelt. Als Ergebnis Get-ChildItem denkt, dass der Speicherort nicht angegeben ist und verwendet den aktuellen env:. Der Provider Environment tut nicht den dynamischen Schalter ReadOnly, so dass schließlich der Befehl fehlschlägt wegen falscher Syntax, obwohl es etwas korrekt ist (der gleiche Befehl funktioniert, wenn der aktuelle Anbieter ist FileSystem).

Fragen:

  • Ist mein Verständnis für das Problem richtig?
  • Ist diese Funktion irgendwo dokumentiert?
  • Gibt es eine Problemumgehung?

Die letzte Frage ist mehr über Benutzerbefehle, die mit dynamischen Parametern entwickelt werden. Das Problem wurde ursprünglich bemerkt und beschrieben als Invoke-Build Issue #4. Im Moment ist dieses Problem nur dokumentiert. Aber ich bin immer noch an einer Problemumgehung interessiert.


Schlussfolgerungen

  • Das beschriebene Problem besteht.
  • Es ist nicht als solches dokumentiert.
  • Möglichkeiten, um zu arbeiten, löst jeder das Problem:
    • Geben dynamische Schalter nach Positionsparameter Argumente
    • dynamischen Schalter Argumente explizit angeben: -ReadOnly:$true
    • nicht Positionsparameter zusammen mit dynamischen Schalter, dh angeben Parameter verwenden Sie Namen.

die Fehler Geöffnet: 960194

+1

Klingt plausibel für mich, obwohl ich dieses Problem noch nie begegnet bin. In Skripten verwende ich niemals Positionsparameter. Ich listet den Parameter immer explizit auf. Vielleicht einen [PowerShell Connect Bug] (https://connect.microsoft.com/PowerShell/) einreichen? –

+0

Ja, ich werde einen Fehler ablegen, ich bin ein ziemlich häufiges Poster da :) Aber es ist unwahrscheinlich, ein Bug :(Zuerst möchte ich wissen, was andere denken. Und vor allem interessiert mich für Workarounds. –

+0

@Aaron Jensen, du hast recht, dass in * scripts * das kein großes Problem ist, aber das Problem ist, dass ich dieses Problem beim Erstellen einer Befehlszeile in einer Konsole gefunden habe und andere Benutzer von * Invoke-Build * könnten dasselbe sehen Probleme bei der Eingabe in Befehlszeilen –

Antwort

3

Ihr Verständnis genau richtig ist.

Der Parameterbinder ist nicht gut dokumentiert, da er extrem komplex ist. Die Sprachspezifikation (http://www.microsoft.com/en-us/download/details.aspx?id=36389) ist die vielleicht beste Dokumentation, die wir haben, aber sie ist unvollständig und ich denke nicht, dass sie diese Situation abdeckt.

Die einzige Problemumgehung, an die ich denken kann, besteht darin, das Argument für den Schalterparameter anzugeben, z.

Get-ChildItem -ReadOnly:$true C:\ 

Fühlen Sie sich frei, einen Fehler zu öffnen. Es wird wahrscheinlich nicht behoben werden, aber es gibt dem Team zumindest die Möglichkeit, darüber zu diskutieren.

Ich würde mir vorstellen, die Korrektur wäre so etwas wie "Wenn die Parameterbindung fehlschlägt und es dynamische Parameter gibt, gehen Sie zurück und nehmen an, dass unbekannte Parameter Schalterparameter sind, und versuchen Sie es erneut". Dies kann entweder zu einem Zeitpunkt mit einem unbekannten Parameter oder auf einmal mit allen Parametern geschehen. Die Parameterbindung kann sehr langsam sein, wenn viele unbekannte Parameter vorhanden sind.

+0

Vielen Dank für die ausführliche Antwort Ich werde einen Fehler öffnen, auch wenn es nicht behoben werden wird.Die Fehlerbehebung ist nicht so einfach.Zum Beispiel kann die Parameterbindung nicht fehlschlagen (wie im Beispiel)) aber positionierte Argumente können stattdessen verschluckt/verschoben werden (wie in der referenzierten Ausgabe). –

Verwandte Themen