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
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? –
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. –
@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 –