选择对象表达式作为字符串

时间:2014-10-22 19:02:43

标签: string powershell

如果我输入我的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表达式列表作为字符串传递?

2 个答案:

答案 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)