代码之家  ›  专栏  ›  技术社区  ›  Patric

计算传递给PowerShell中函数的字符串内的变量

  •  0
  • Patric  · 技术社区  · 7 年前

    我有这样一个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 ).

    现在,变量当然不会被计算为objects值($listItem的“Title”列值),因为它是作为字符串传递的,因为“$”是转义的(将查询传递给函数时需要转义)。

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   Patric    7 年前

    感谢您的评论,尤其是@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