2016-08-01 14 views
2

Ist es möglich, Variablennamen in PowerShell zu drucken?Ist es möglich, Variablennamen zu drucken?

$myVariable = "My Value" 
Write-Host "The variable name is ?????" 

Erwartete Ausgabe:

Der Variablenname myVariable ist

Frage 2 (komplizierter): Ist es möglich, eine Funktion in Powershell geben Variablennamen drucken?

Function MyFunc($myArg){ 
    Write-Host "The variable name is ?????" 
} 

$myVariable = "My Value" 
MyFunc $myVariable 

Erwartete Ausgabe:

Der Variablenname ist myVariable

+0

"* Ist es möglich, Variablennamen in Power zu drucken Shell? * "- ist sicher; Überprüfen Sie die Anzahl der Posts auf StackOverflow, wo die Leute fragen: "' Write-Host 'Der Variablenname ist $ myVariable'' - warum zeigt dies nur den Namen, nicht den Wert? " – TessellatingHeckler

Antwort

7

Nein!

(zumindest nicht in zuverlässiger Art und Weise)

Der einfache Grund ist, dass Kontextinformationen über eine Variable, als Parameter Argument verwiesen wird durch die Zeit abgestreift wurden, können Sie tatsächlich den Parameterwert prüfen innerhalb der Funktion.

Lange vor der Funktion tatsächlich aufgerufen wird, hat sich der Parser den Wert jedes einzelnen Parameter Argument ausgewertet, und (optional) dazu gezwungen, die Typ des Wert-Typ, was auch immer durch den Parameter erwartet wird, es ist gebunden an .

So ist die Sache, die letztlich als Argument an die Funktion übergeben wird, ist nicht die Variablen $myVariable, aber der (möglicherweise dazu gezwungen) Wert von $myVariable.

sehen die about_Parsing help file (Get-Help about_Parsing) für mehr zu diesem Thema


Es ist vielleicht auch erwähnenswert, dass es keine Garantie gibt, dass ein Parameter Argument ist eine Variable und nicht eine wörtliche oder eine andere Wertausdruck:

PS C:\> MyFunc 'This is not even a variable' 
PS C:\> MyFunc $('Neither','is','this' -join ' ') 

Sie können einige Informationen über (potentiell) erhalten Variablen verwendet, um in der anrufenden Kontext suchen, abgerufen durch die Get-PSCallStack cmdlet:

function Get-ImmediateInvocationString 
{ 
    param($myArg) 

    # Grab second-to-last call 
    return @(Get-PSCallStack)[-2].InvocationInfo.Line 
} 

verwenden Sie es dann wie:

PS C:\> $myVariable = "someValue" 
PS C:\> Get-ImmediateInvocationString -myArg $myVariable 
Get-ImmediateInvocationString -myArg $myVariable 

Sie könnten (ab) verwenden, um dies das Argument -myArg, von sagen wir greifen die letzte "Variable-like" String im Aufruf zu folgern:

function Get-ImmediateInvocationString 
{ 
    param($myArg) 

    # Grab second-to-last call 
    $Line = @(Get-PSCallStack)[-2].InvocationInfo.Line 
    if($Line -match '\$(?<varName>[\w]+)\s*$'){ 
     Write-Host $Matches['varName'] 
    } 
} 

Dies mag scheinen, wie es zu Beginn große Werke:

PS C:\> Get-ImmediateInvocationString -myArg $myVariable 
myVariable 

Bis ein Benutzer, der nicht über Ihre Konformität Erwartungen schert mitkommt:

PS C:\> Get-ImmediateInvocationString -myArg $myVariable; $lol = ""; Write-Host $lol 
lol 

Also nein, können Sie nicht tun, was Sie möchten, ohne den aufrufenden Ausdruck in der gleichen Weise zu analysieren wie der eigentliche Parser.

+0

Nun, es ist schade, aber anscheinend ist manchmal die richtige Antwort "Nein". – Eiver

+1

@Eiver Aber bedauerlich, ja :) –

4

Sie das Get-Variable Cmdlets verwenden könnte die Variable zu lösen und dann den Namen wählen, aber Sie haben immer noch den Namen angeben so seine Art von unbrauchbar:

Ausgang:

myVariable 

Ich bezweifle, das möglich, den Namen der Variablen drucken Sie auf eine Funktion sind vorbei ...

+2

'Get-Variable | ? {[string] $ args [0] -ceq $ _. Wert} | Wählen Sie "Name erweitern" –

+1

@AnsgarWiechers Nette Idee! Funktioniert aber nur, wenn keine andere Variable mit dem gleichen Wert belegt ist. –

+2

Wahr, sonst gibt es mehrere Ergebnisse zurück.Aber es ist der einzige Weg, den ich sehen kann, um den Namen für eine Variable zu bekommen, ohne vorher den Namen zu kennen. '$ args [0]' funktioniert allerdings nicht wie erwartet. Suchen Sie dort einen Parameter oder eine andere Variable (und listen Sie den übergeordneten Bereich auf, um falsche positive Ergebnisse von der Funktion selbst zu vermeiden): 'function MyFunc {Param ($ v); Get-Variable -Scope 1 | ? {$ v -ceq $ _. Wert} | Wählen Sie -Expand Value}. –

0

Ist es möglich, Variablennamen in PowerShell zu drucken?

$myVariable = "My Value"

Write-Host "The variable name is ?????"

was zu erreichen?

PS C:\> $originalNames = (get-variable).Name + 'originalNames' 
PS C:\> $myVariable = "~ My ~ Value" 
PS C:\> write-Host "The variable name is: $((Get-Variable).Name |? {$_ -notin $originalNames})" 
The variable name is: myVariable 
-1
$myVariable = "My Value" 
$varname=[STRING]'$myVariable' -REPLACE ('\$') 
Write-Host "The variable name is $varname" 
-1

$ myVariable = "My Value"

Write-Host "Der Variablenname ist ` $ myVariable"

Hallo Leute vor meinem Beitrag Bearbeitung nur die kleine aussehen" `" Signe vor dem "$" Dies ist die Sache, die Drucken Variablenname wie es ist ...

Verwandte Themen