评估传递给 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
我有一个这样的 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