评估传递给 PowerShell 中函数的转义字符串中的变量

Evaluate variable(s) inside string passed escaped to function in PowerShell

我有一个这样的 PowerShell 函数(我在这里简化了它以使其更容易理解):

Function QueryList
{
    param(
        [Parameter(Mandatory=$true,Position=1)]
        [Microsoft.SharePoint.SPList] $list
        [Parameter(Mandatory=$true,Position=2)]
        [string] $camlQuery
    )

    $itemsQry = New-Object Microsoft.SharePoint.SPQuery
    $itemsQry.Query = $camlQuery
    $itemsQry.ViewFieldsOnly = $false
    $itemsQry.RowLimit = 0
    $itemsQry.ViewAttributes = "Scope='Recursive'"
    return $list.GetItems($itemsQry)
}

Function MigrateList
{
    param(
        [Parameter(Mandatory=$true,Position=1)]
        [Microsoft.SharePoint.SPList] $list,
        [Parameter(Mandatory=$true,Position=2)]
        [string] $matchingItemsQuery
    )

    foreach ($listItem in $list.Items)
    {
        # get items using the query (how to inject '$listItem' into query string?)
        $targetItem = QueryList -list $list -camlQuery $matchingItemsQuery

        # do something with matching items
        ...
    }
}

# main script
$matchingItemsQuery  = "<Where><Eq><FieldRef Name='Title' /><Value Type='TEXT'>`$(`$listItem[`"Title`"])</Value></Eq></Where>"
$targetItems = MigrateList -list $listXy -matchingItemsQuery $matchingItemsQuery

如您所见,我想从列表中查询一些符合给定条件的项目。随着条件从一个列表变为另一个列表 我希望能够将查询传递给函数,在查询内部有一个对变量的引用,该变量将仅存在于 'MigrateList' 函数 n(此处:$listItem)。

就像现在一样,变量当然不会被评估为对象值("Title" $listItem 的列值),因为它作为字符串传递,因为 '$' 被转义(这是将查询传递给函数所必需的)。

我知道它可能不是最好的构造,但它可以完成工作。那么,我该如何更改将传递的查询字符串与 $listItem 对象(在本例中为列值)一起注入的脚本?

感谢您的评论,尤其是@TheIncorrigible1 提供的有关使用脚本块的提示,我(成功)尝试实现了该提示。

我得到它来处理这个:

Function MigrateList
{
    param(
        [Parameter(Mandatory=$true,Position=1)]
        [Microsoft.SharePoint.SPList] $list,
        [Parameter(Mandatory=$true,Position=2)]
        [scriptblock] $itemMatchQuerySb
    )

    foreach ($listItem in $list.Items)
    {
        # get items using the query (how to inject '$listItem' into query string?)
        $matchingItemsQuery = (. $itemMatchQuerySb)
        $targetItem = QueryList -list $list -camlQuery $matchingItemsQuery

        # do something with matching items
        ...
    }
}

# main script
$matchingItemsQuerySb  = [scriptblock]::Create("echo ""<Where><Eq><FieldRef Name='Title' /><Value Type='Text'>`$(`$listItem[`"Title`"])</Value></Eq></Where>""")
$targetItems = MigrateList -list $listXy -matchingItemsQuery $matchingItemsQuery