是否可以在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 :(得分: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
答案 9 :(得分:-1)
$myVariable = "My Value"
$varname=[STRING]'$myVariable' -REPLACE ('\$')
Write-Host "The variable name is $varname"