是否可以打印变量名称?

时间:2016-08-01 11:01:56

标签: powershell

是否可以在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

10 个答案:

答案 0 :(得分:9)

没有!

(至少不是以可靠的方式)

简单的原因是,当您实际检查函数内部的参数值时,有关被引用为参数参数的变量的上下文信息将被剥离。

在实际调用函数之前很久,解析器将评估每个参数参数的,并且(可选)将所述值的类型强制转换为任何值类型是由它所绑定的参数所期望的。

所以最终作为参数传递给函数的东西是变量$myVariable,而{{>> {{1>} 1}}。

有关此主题的更多信息,请参阅about_Parsing help file $myVariable

也许值得注意的是,不能保证参数参数是变量而不是文字或其他值表达式:

Get-Help about_Parsing

通过查看通过Get-PSCallStack cmdlet检索的调用上下文,您可以获得有关(可能)使用过的变量的一些信息:

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

然后使用它:

function Get-ImmediateInvocationString
{
    param($myArg)

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

你可以(ab)使用它来推断PS C:\> $myVariable = "someValue" PS C:\> Get-ImmediateInvocationString -myArg $myVariable Get-ImmediateInvocationString -myArg $myVariable 的参数,比如抓住最后一个"变量"调用中的字符串:

-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

所以不,你不能按照与实际解析器相同的方式解析调用表达式而做你想做的事。

答案 1 :(得分:5)

您可以使用Get-Variable cmdlet来解析变量,然后选择名称,但您仍然需要指定名称以使其无用:

(Get-Variable myVariable | select -ExpandProperty Name)

<强>输出:

myVariable

我怀疑是否可以打印传递给函数的变量的名称......

答案 2 :(得分:4)

$ myVariable =“我的价值”

Write-Host“变量名是` $ myVariable”

在编辑我的帖子之前,嘿家伙只看“$”之前的小“signe” 这是alloow打印变量名称的原因......

答案 3 :(得分:1)

关于问题1;在命令中未指定所需的变量

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

因此Write-Host命令不可能知道您想要哪个变量的名称。

例如:

$1stVariable = "1st Value"
$2ndVariable = "2nd Value"

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

PowerShell如何知道您想要$ 1stVariable还是$ 2ndVariable的名称,除非您指定哪个名称。因此,如果未直接指定变量名称,则必须指定一个单独的变量来存储所有变量信息,就像我的其他示例一样。


问题1的答案

$myVariable = "My Value"

"The variable name is $((Get-Variable myVariable).Name)"    
"The variable value is $((Get-Variable myVariable).Value)"

问题2的答案

$AnotherVariable = "Another Value"

Function MyFunc ($myArg) {
   "The variable name is $($myArg.Name)"
   "The variable value is $($myArg.Value)"
}

MyFunc (Get-Variable AnotherVariable)

其他示例

# No specific variable names are passed as arguments to the function "CustomFunc". 

$Var1 = "1st"
$Var2 = 2
$Var3 = "3rd"
$Var4 = 4

$AllVars = (Get-Variable Var1, Var2, Var3, Var4)

Function CustomFunc ($myArg) {
   "The variable name is $($myArg.Name)"
   "The variable value is $($myArg.Value)"
}

ForEach ($Var in $AllVars) {
    CustomFunc $Var
    ""
}

答案 4 :(得分:1)

对于问题2,根据您要达到的目标,可能会满足您的要求:

function showDebug
{
Param(

    [string]$debugVariable
)
    $debugValue = Get-Variable $debugVariable
    write-host "Variable `$$($debugValue.Name) = $($debugValue.Value)"
} 

$tempvariable = "This is some text"
showDebug "tempvariable"

在我的情况下,我只希望一个函数输出一些调试信息(稍后将检查该函数是否启用了调试以及该函数本身中的其他内容),并输出该变量的名称以及为其分配的内容。

如果将实际变量传递给该函数将不起作用,但是如果将该变量的名称作为字符串传递(例如,“ tempvariable”而不是$ tempvariable),则Get-Variable cmdlet将成功查询该变量并返回“名称和值”对,以便可以根据需要同时引用它们。

因此,使用此方法返回的结果是:

Variable $tempvariable = This is some text

答案 5 :(得分: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

答案 6 :(得分:0)

我可能会误解这一点,但是我已经做到了:

> $myVariable="something"
> (get-variable myVariable).Name
myVariable

我已经安装了Powershell 5.1.17763.592。

答案 7 :(得分:0)

混乱,但是没有将变量的名称像硬编码一样写回到脚本中。您只需要更改下面的第6行

Try {
    # Get a list of all set variables
    $AutomaticVariables = Get-Variable

    # Set your variable
    $TestVariable = 'Bloop'

    # Compare another list of all set variables to determine what has been set since
    $NewestVariable = Compare-Object (Get-Variable) $AutomaticVariables -Property Name -PassThru | Where -Property Name -ne "AutomaticVariables"

    # Defensive check to ensure exactly 1 entry is present
    if ($($NewestVariable | Measure-Object).Count -ne 1) {
        Write-Host "ERROR : Unable to determine most recently set variable"
        throw
    }

    # Display Result
    Write-Host "Newest variable $($NewestVariable.Name) has value    $($NewestVariable.Value)"
} Catch {
    Write-Host "ERROR : $($_.Exception.Message)"
    Exit 1
}

答案 8 :(得分:0)

代码

基于此问题中已接受的答案。 Is it possible to print variable names?

function Get-VariableName {
    Param(
        [Parameter()]    
        [System.Object]
        $Variable
    )
    $Line = @(Get-PSCallStack)[1].Position.Text
    if ($Line -match '(.*)(Get-VariableName)([ ]+)(-Variable[ ]+)*\$(?<varName>([\w]+:)*[\w]*)(.*)') { #https://regex101.com/r/Uc6asf/1
        return $Matches['varName'] 
    }
} 

$myVar = "HelloWorld"
Get-VariableName -Variable $myVar
Get-VariableName $myVar
Get-VariableName $env:PATH

输出

PS /home/x> Get-VariableName -Variable $myVar
myVar
PS /home/x> Get-VariableName $myVar
myVar
PS /home/x> Get-VariableName $env:PATH
env:PATH
PS /home/x>

Windows 10 - Powershell Core - Powershell 7.1 Windows

WSL - Ubuntu 20.04 - Powershell Core - Powershell 7.1 Ubuntu WSL

Ubuntu 20.04 - Powershell 核心 - Powershell 7.1 Ubuntu 20.04

答案 9 :(得分:-1)

$myVariable = "My Value"
$varname=[STRING]'$myVariable' -REPLACE ('\$')
Write-Host "The variable name is $varname"