2015-02-24 7 views
6

In einem Power Fenster:Warum teilt PowerShell Argumente mit Bindestrichen und Punkten auf?

PS C:\> echo -abc.def.ghi 
-abc 
.def.ghi 

Aus irgendeinem Grunde die Kombination von einem Bindestrich und die Periode Ursache Powershell das Argument in zwei Zeilen aufgeteilt.

Es ist nicht mit ohne Bindestrich auftritt:

PS C:\> echo abc.def.ghi 
abc.def.ghi 

auch nicht auftreten es, wenn es keine Perioden sind:

PS C:\> echo -abcdefghi 
-abcdefghi 

Durch Versuche habe ich fand ich das Verhalten entweichen kann mit ein Graviszeichen:

PS C:\> echo `-abc.def.ghi 
-abc.def.ghi 

Aber warum doe s dies geschieht? Welchen grundlegenden Teil der PowerShell-Syntax verstehe ich nicht?

+1

Hmm, interessant. Ich notiere "Echo" -abc.def "' funktioniert wie erwartet, das könnte ein Hinweis sein. –

+1

Angenommen, Sie verwenden PowerShell V3 +, können Sie dieses '{echo -abcdef.ghi} .Ast.EndBlock.Statements [0] .PipelineElements [0] .CommandElements verwenden ', um zu sehen, wie dies vom Parser interpretiert wird – PetSerAl

Antwort

5

Ich habe Microsoft.PowerShell.Utility zerlegt den Code von Write-Output nichts Besonderes dort zu suchen, es iteriert nur durch Inputobject und geht jeweils an ein WriteObject durch die aktuellen ICommandRuntime implementiertes Verfahren.

Disassembled <code>Write-Output</code>

Meine Vermutung ist, dass die tokenizer, die den Text verarbeiten versucht, alles zu passen, beginnend mit einem - zu einem deklarierten Parameter. Andernfalls wird es in der Pipeline als Element in -InputObject übergeben. Da ein . nicht Teil eines Variablennamens sein kann und daher nicht Teil eines Switchnamens sein kann, kann er ihn vor der if - Prüfung trennen, und wenn es sich herausstellt, dass er ein Parameter ist, wird er nicht mit dem Rest des Token. Möglicherweise haben Sie einen kleinen Fehler gefunden.

Bei Verwendung des Back-Ticks oder der Anführungszeichen macht es diesen Fehler jedoch nicht, da es die gesamte Sache in Tokens verwandeln kann.

Dies ist alles Vermutung, aber ich würde gerne eine autoritative Antwort so viel wie Sie sehen.

bearbeiten

Nachweis dessen, was ich sagen will:

+1

' .' kann Teil des Variablennamens sein: '$ {Fast jedes Zeichen kann Teil des Variablennamens sein.}'. – PetSerAl

+0

@PetSerAl nun ja, aber nicht ohne Klammern so meine Das Argument gilt immer noch. Aber guter Punkt, –

+0

Das ist kein Fehler, das ist ein Feature. 'command -s. \ localfile' tut dann, was Sie wollen. Das gleiche Verhalten tritt für 'command -s: localfile' auf, aber nicht für' command -s # localfile ". –

1

FYI nicht sicher, ob George zu erwähnen versuchte oder nicht, aber echo ist ein Alias ​​für Write-Output in Powershell.

PS C:\temp> Get-Alias echo 

CommandType  Name            ModuleName                     
-----------  ----            ----------                     
Alias   echo -> Write-Output  

Im Beispiel echo -abc.def.ghi der Parser sieht den unquoted Bindestrich als Präfix für einen Parameter/Schalternamen. Die Periode hat auch eine besondere Bedeutung. Parameter können keine Punkte enthalten, so dass der Parser diesen wie den String-Terminator behandelt.

Als Ganzes write-output sieht es als ein Array, so dass es positionsmäßig angepasst ist

(I i mit meiner Behauptung nicht völlig falsch bin hoffen.) -InputObject

+0

Also, ohne den Bindestrich wird es * nicht * als Parameter betrachtet? –

+1

Es wird nicht versuchen, es anzupassen. Es würde nur versuchen, es an diesem Punkt positionell zuzuordnen. Ich würde auch nicht versuchen, die Perioden zu analysieren. Deshalb ist das Zitieren eine gute Übung – Matt

+1

Ich widerspreche aus Gründen zu vieler Matts! –

Verwandte Themen