评估传递转义为在PowerShell中运行的字符串内的变量

时间:2017-11-21 14:09:42

标签: string powershell dynamic escaping inject

我有这样的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

如您所见,我想查询列表中的某些项目,以匹配给定的条件。随着条件从列表更改为列表我希望能够将查询传递给函数,在查询内部有一个对变量的引用,该变量仅存在于&lt; MigrateList&#39;功能 n(此处:$listItem)。

就像现在一样,变量当然不会被评估为对象值(&#34;标题&#34; $ listItem的列值),因为它作为字符串传递,如&#39; $ &#39;被转义(将查询传递给函数所需的)。

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

1 个答案:

答案 0 :(得分:0)

感谢您的评论,尤其是@ TheIncorrigible1,以获取有关使用脚本块的提示,我已经(已成功)尝试实施。

我得到了它的工作:

property