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.
"* 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