如果我输入我的Powershell select-object表达式,如下所示:
$csvdata | Select-Object @{expression={$_.1}; label='first'}
我收到了所需的输出:
first
-
mike
john
但是,如果我先将表达式存储为字符串,然后将该字符串作为select-object的表达式调用:
$tstexp = "@{expression={`$_.1}; label='first'}"
$csvdata | Select-Object $tstexp
输出未正确评估,而是用作对象名称。
@{expression={$_.1}; label='first'}
-------------------------------
是否可以将select-object表达式列表作为字符串传递?
答案 0 :(得分:6)
您可以将其作为[Hashtable]
传递:
$tstexp = @{expression={$_.1}; label='first'}
$csvdata | Select-Object $tstexp
(只需删除引号)。
如果必须是一个字符串(我只能想象你正在从脚本外部读取/生成它),那么你可以将它评估为一个脚本块:
# Create the string
$tstexp = "@{expression={$_.1}; label='first'}"
# Convert to script block
$tstblock = [scriptblock]::Create($tstexp)
# Execute script block
$tstval = & $tstblock
# $tstval now contains the hashtable
$csvdata | Select-Object $tstval
如果你必须使用字符串,那么使用Invoke-Expression
会更容易,因为Jeroen Mostert的答案会解释(当然,如果可能的话,请避免使用字符串)。
答案 1 :(得分:3)
您正在寻找Invoke-Expression
:
$csvdata | select-object (Invoke-Expression $tstexp)