是否可以打印变量名称?

Eiv*_*ver 4 powershell

是否可以在PowerShell中打印变量名称?

$myVariable = "My Value"
Write-Host "The variable name is ?????"
Run Code Online (Sandbox Code Playgroud)

预期产量:

变量名是myVariable

问题2(更棘手):是否可以打印传递给PowerShell中的函数的变量名?

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

$myVariable = "My Value"
MyFunc $myVariable
Run Code Online (Sandbox Code Playgroud)

预期产量:

变量名是myVariable

Mat*_*sen 10

没有!

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

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

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

以便最终作为一个参数传递给函数的事情是变量$myVariable,但是(潜在裹挟)$myVariable.

about_Parsing有关此主题的更多信息,请参阅帮助文件(Get-Help about_Parsing)


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

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

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

function Get-ImmediateInvocationString
{
    param($myArg)

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

然后使用它像:

PS C:\> $myVariable = "someValue"
PS C:\> Get-ImmediateInvocationString -myArg $myVariable
Get-ImmediateInvocationString -myArg $myVariable
Run Code Online (Sandbox Code Playgroud)

您可以(ab)使用它来推断参数-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'] 
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎在开始时效果很好:

PS C:\> Get-ImmediateInvocationString -myArg $myVariable
myVariable
Run Code Online (Sandbox Code Playgroud)

在不关心您的一致性预期的用户出现之前:

PS C:\> Get-ImmediateInvocationString -myArg $myVariable; $lol = ""; Write-Host $lol
lol
Run Code Online (Sandbox Code Playgroud)

所以不,如果不以与实际解析器相同的方式解析调用表达式,就无法做到你想要的.


Mar*_*ndl 6

您可以使用Get-Variablecmdlet来解析变量,然后选择名称,但您仍然必须指定名称,以使其无用:

(Get-Variable myVariable | select -ExpandProperty Name)
Run Code Online (Sandbox Code Playgroud)

输出:

myVariable
Run Code Online (Sandbox Code Playgroud)

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

  • `Get-Variable | ?{[string] $ args [0] -ceq $ _.值} | 选择-Expand Name` (2认同)
  • 没错,否则会返回多个结果.但它是我能看到得到的名称的变量,而不知道名称预先的唯一途径.`的$ args [0]我所预料的'不工作,虽然.需要一个参数或另一个变量有(和枚举父范围,以避免从函数本身误报):`函数MYFUNC {参数($ V); 获取变量-Scope 1 | ?{$ V -ceq $ _值} | 选择-Expand值}`. (2认同)

小智 5

$myVariable = "My Value"
Write-Host "The variable name is **`**$myVariable"
Run Code Online (Sandbox Code Playgroud)

在编辑我的帖子之前,只需查看“$”之前的小“`”符号,这是允许按原样打印变量名称的东西。

  • 当然,我们的想法是检测变量名称 - 而不是像您一样在代码中再次手动写入名称。 (2认同)