2016-08-01 2 views
2

Возможно ли печатать имена переменных в PowerShell?Можно ли печатать имена переменных?

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

Ожидаемый результат:

Имя переменной MYVARIABLE

Вопрос 2 (более сложная): Можно ли печатать имя переменной передается функции в PowerShell?

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

$myVariable = "My Value" 
MyFunc $myVariable 

Ожидаемый результат:

Имя переменной MYVARIABLE

+0

«* Возможно ли печатать имена переменных в Power Shell? * "- уверен; просмотрите количество сообщений в StackOverflow, где люди спрашивают: «Write-Host» Имя переменной - $ myVariable'' - почему это только показывает имя, а не значение? » – TessellatingHeckler

ответ

7

Нет!

(по крайней мере, не в надежной моды)

Простая причина в том, что контекстная информация о переменном ссылочного как аргумент параметра будет уже отбрасываются к тому времени, вы можете проверить значение параметра внутри функции.

задолго до функции на самом деле называется, СА оценивали значение каждого отдельного аргумента параметра, и (необязательно) принуждают к типа указанного значения для любого типа, как ожидается, с помощью параметра это обязательно ,

Так что вещь, которая в конечном счете, передаются в качестве аргумента функции не переменной $myVariable, но (потенциально принуждает) значения из $myVariable.

см about_Parsing help file (Get-Help about_Parsing) больше по этой теме


Это, возможно, также стоит отметить, что нет никакой гарантии, что аргумент параметра является переменной и не буквальной или другим выражение значение:

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

Вы можете получить некоторую информацию о (потенциально) используются переменные, глядя на контекст вызова, извлекается через Get-PSCallStack cmdlet:

function Get-ImmediateInvocationString 
{ 
    param($myArg) 

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

Затем используйте это нравится:

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

Вы могли бы (аb) использовать это, чтобы вывести аргумент -myArg, путем захвата говорят последний «переменной типа» строка в вызове:

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'] 
    } 
} 

Это может показаться, что он прекрасно работает в самом начале:

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

До тех пор пока пользователь, который не заботится о своем аттестационном ожидании не приходит:

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

Так нет, вы не можете делать то, что вы хотите без разбора вызывающего выражения так же, как и фактический парсер.

+0

Ну, это слишком плохо, но, по-видимому, иногда правильный ответ - «Нет». – Eiver

+1

@Eiver Однако неудачно, да :) –

4

Вы можете использовать Get-Variable командлет, чтобы решить эту переменную, а затем выберите имя, но вы все равно должны указать имя поэтому его вид бесполезен:

(Get-Variable myVariable | select -ExpandProperty Name) 

Выход:

myVariable 

я сомневаюсь, его можно напечатать имя переменной, которую вы передаете в функцию ...

+2

'Get-Variable | ? {[string] $ args [0] -ceq $ _. Значение} | выберите -Открыть имя' –

+1

@AnsgarWiechers Хорошая идея! Но будет работать, только если нет другой переменной, назначенной с тем же значением. –

+2

Верно, иначе он вернет несколько результатов.Но это единственный способ увидеть имя переменной, не зная названия заранее. '$ args [0]' не работает, как я и ожидал. Вам нужен параметр или другая переменная (и перечислять родительскую область, чтобы избежать ложных срабатываний от самой функции): 'function MyFunc {Param ($ v); Get-Variable -Scope 1 | ? {$ v -ceq $ _. Значение} | выберите «Expand Value»}. –

0

Возможно ли печатать имена переменных в PowerShell?

$myVariable = "My Value"

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

Чтобы достичь чего?

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 "Имя переменной ` $ MYVARIABLE"

Эй, ребята, прежде чем редактировать мой пост просто посмотреть маленький" `` signe перед «$» Это то, что имя переменной печати alloow как есть ...

Смежные вопросы