如何阻止Add-PnPFile在SharePoint中覆盖文件?
我用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

