是否可以在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)
所以不,如果不以与实际解析器相同的方式解析调用表达式,就无法做到你想要的.
您可以使用Get-Variablecmdlet来解析变量,然后选择名称,但您仍然必须指定名称,以使其无用:
(Get-Variable myVariable | select -ExpandProperty Name)
Run Code Online (Sandbox Code Playgroud)
输出:
myVariable
Run Code Online (Sandbox Code Playgroud)
我怀疑是否可以打印传递给函数的变量的名称...
小智 5
$myVariable = "My Value"
Write-Host "The variable name is **`**$myVariable"
Run Code Online (Sandbox Code Playgroud)
在编辑我的帖子之前,只需查看“$”之前的小“`”符号,这是允许按原样打印变量名称的东西。
| 归档时间: |
|
| 查看次数: |
7185 次 |
| 最近记录: |