You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PnP PowerShell批量更新匹配txt内容的SharePoint列表项咨询

问题原因

你的脚本报错核心是两个问题:

  • Set-PnPListItem的-Identity参数没有传入有效值:你写的代码里-Identity后面直接跟了下一个参数-Values,相当于传了空值;之前尝试用的$_.Server也不生效,因为foreach循环内当前迭代对象是$line,不存在$_这个管道上下文对象,且-Identity要求传入列表项ID、ListItem实例对象,不能直接传Server字段的文本值。
  • 缺少匹配逻辑:循环读取txt的服务器名后,没有查询列表中Server字段和该名称匹配的条目,直接执行更新自然找不到目标。

你提到的通过CAML查询传入$line参数、直接筛选Server字段匹配的列表项的思路完全可行,在列表条目量大的时候性能优于全量拉取的方案。

修正方案(CAML查询版)

直接替换脚本里的对应内容即可运行,注意修改标注的占位符:

$pathRead = "D:\CertScipts\Servrar_Prod.txt"
Import-Module "C:\PNP\SharePointPnPPowerShell2019\3.6.1902.2\SharePointPnPPowerShell2019.psd1"
if ($null -eq $cred)
{ 
    $cred = Get-Credential
}
# 替换为你实际的SharePoint站点地址,原脚本中的"-"为无效占位符
Connect-PnPOnline "https://你的租户/你的站点地址" -Credentials $cred
$list = Get-PnPList "Certifikat Auto"

foreach($serverName in Get-Content $pathRead) 
{  
    # 跳过txt中的空行
    if([string]::IsNullOrWhiteSpace($serverName)){ continue }
    # 处理服务器名前后多余空格
    $serverName = $serverName.Trim()
    # 构造CAML查询匹配当前服务器名对应的条目
    $camlQuery = @"
<View>
    <Query>
        <Where>
            <Eq>
                <FieldRef Name='Server' />
                <Value Type='Text'>$serverName</Value>
            </Eq>
        </Where>
    </Query>
</View>
"@
    # 查询匹配项并更新
    $matchedItems = Get-PnPListItem -List $list -Query $camlQuery
    foreach($item in $matchedItems)
    {
        Set-PnPListItem -List $list -Identity $item.Id -Values @{"Farm" = "PROD"}
    }
}

注意事项

  • 如果你的Server字段是查找类型、选项类型,或者字段内部名称不是Server,需要对应修改CAML里的FieldRef的Name属性、Value的Type属性:比如查找类型字段要把Type改为Lookup,使用字段实际内部名替换Server。
  • 如果需要批量更新大量条目,可以给Set-PnPListItem加上-UpdateType SystemUpdate参数,避免修改条目修改时间、触发不必要的流或工作流。
备选方案(全量内存匹配版)

如果列表总条目数低于5000,可以一次性拉取所有列表项到内存匹配,减少请求次数:

# 连接站点获取列表后,一次性拉取所有列表项
$allItems = Get-PnPListItem -List $list -PageSize 1000
# 读取txt中所有有效服务器名,存入哈希表做快速匹配
$serverSet = @{}
Get-Content $pathRead | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | ForEach-Object {
    $serverSet[$_.Trim()] = $true
}
# 遍历条目匹配更新
foreach($item in $allItems)
{
    $currentServer = $item["Server"]?.ToString().Trim()
    if($serverSet.ContainsKey($currentServer))
    {
        Set-PnPListItem -List $list -Identity $item.Id -Values @{"Farm" = "PROD"}
    }
}

内容的提问来源于stack exchange,提问作者Gatewarden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:54:17