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

如何阻止Add-PnPFile在SharePoint中覆盖文件?

问题:SharePoint Online上传同名文件被覆盖的处理方案

我用PowerShell脚本通过Add-PnPFile上传文件到SharePoint Online时发现,只要文件名相同,哪怕文件物理路径、元数据完全不同,后上传的文件都会覆盖先上传的。比如:

[redacted]\6 Staff Records\CSA Performance Reviews\zzSP Testing - Johnny Depp\Performance\Call Reviews (1).docx
[redacted]\6 Staff Records\CSA Performance Reviews\zzPS Testing - Angelina Jolie\Performance\Call Reviews (1).docx

后者上传时会直接覆盖前者,我目前只能手动给文件名加时间戳临时解决:

$ActualLocation="[redacted]\6 Staff Records\CSA Performance Reviews\zzPS Testing - Angelina Jolie\Performance\Call Reviews (1).docx"
$NewFileName="Call Reviews (1) (62499159).docx"
add-pnpfile -Path $ActualLocation -NewFileName $NewFileName -Folder  $_doclibName -Values $values

但这种方法太繁琐,有没有办法通过Add-PnPFile让SharePoint识别这是独立的唯一文件?


解决方案

SharePoint Online默认会用同名文件覆盖已有文件,Add-PnPFile本身没有直接标记“唯一文件”的参数,但可以通过以下两种更自动化的方式解决,不用手动加时间戳:

方法一:自动生成带序号的唯一文件名

先检查目标文件夹是否存在同名文件,若存在则自动在文件名后加序号(如(1),(2)),再执行上传。示例代码:

$ActualLocation = "[redacted]\6 Staff Records\CSA Performance Reviews\zzPS Testing - Angelina Jolie\Performance\Call Reviews (1).docx"
$targetFolder = "目标文档库路径" # 替换为你的文档库文件夹路径
$values = @{ Title = "自定义元数据" } # 替换为你的元数据

# 拆分文件名和扩展名
$fileBaseName = [System.IO.Path]::GetFileNameWithoutExtension($ActualLocation)
$fileExt = [System.IO.Path]::GetExtension($ActualLocation)

# 循环检查并生成唯一文件名
$currentName = $fileBaseName
$counter = 1
while (Get-PnPFile -Url "$targetFolder/$currentName$fileExt" -ErrorAction SilentlyContinue) {
    $currentName = "$fileBaseName ($counter)"
    $counter++
}
$uniqueFileName = "$currentName$fileExt"

# 执行上传
Add-PnPFile -Path $ActualLocation -NewFileName $uniqueFileName -Folder $targetFolder -Values $values

方法二:禁止覆盖,手动处理冲突

使用-Overwrite $false参数,当遇到同名文件时命令会抛出错误,你可以捕获错误后做自定义处理(比如自动重命名或提示用户):

$ActualLocation = "[redacted]\6 Staff Records\CSA Performance Reviews\zzPS Testing - Angelina Jolie\Performance\Call Reviews (1).docx"
$targetFolder = "目标文档库路径"
$values = @{ Title = "自定义元数据" }

try {
    # 尝试上传,禁止覆盖
    Add-PnPFile -Path $ActualLocation -Folder $targetFolder -Values $values -Overwrite $false
}
catch {
    Write-Host "检测到同名文件,将自动生成唯一文件名重新上传"
    # 插入自动生成唯一文件名逻辑
    $fileBaseName = [System.IO.Path]::GetFileNameWithoutExtension($ActualLocation)
    $fileExt = [System.IO.Path]::GetExtension($ActualLocation)
    $currentName = $fileBaseName
    $counter = 1
    while (Get-PnPFile -Url "$targetFolder/$currentName$fileExt" -ErrorAction SilentlyContinue) {
        $currentName = "$fileBaseName ($counter)"
        $counter++
    }
    $uniqueFileName = "$currentName$fileExt"
    Add-PnPFile -Path $ActualLocation -NewFileName $uniqueFileName -Folder $targetFolder -Values $values
}

如果你的需求是保留两个独立文件,方法一的自动重命名逻辑更省心;如果只是想避免误覆盖,方法二可以提前拦截冲突并灵活处理。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:57:32