使用PowerShell的New-RsFolder递归创建SSRS文件夹层级失败
解决SSRS PowerShell递归创建多级文件夹层级的问题
嘿,我太懂这种头疼的感觉了——New-RsFolder本身确实只能创建单级文件夹,直接怼嵌套路径肯定会报错,因为它没法自动识别并创建中间的父文件夹。不过咱们可以写个递归函数来解决这个问题,让脚本自动逐层创建所有嵌套的子目录,完美还原原有的文件夹层级。
核心思路
New-RsFolder要求-Path参数必须是已经存在的父文件夹路径,所以我们得把嵌套路径拆成一级一级的目录,从根目录开始,依次检查每一级是否存在,不存在就创建,直到走完所有层级。
完整实现代码
Import-Module ReportingServicesTools function New-RsFolderRecursive { [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string]$ReportServerUri, # 新SSRS服务器的地址,比如http://newssrs/ReportServer [Parameter(Mandatory=$true)] [string]$TargetFolderPath, # 要创建的完整嵌套路径,比如"/Sales/2024/Q1" [string]$ApiVersion = "v2.0" ) # 拆分路径为各级目录,过滤掉空字符串(比如路径开头的/会产生空元素) $folderLevels = $TargetFolderPath -split "/" | Where-Object { $_ -ne "" } $currentPath = "/" foreach ($folder in $folderLevels) { $fullPath = Join-Path -Path $currentPath -ChildPath $folder -AdditionalSeparator "/" # 检查当前层级的文件夹是否存在 try { Get-RsFolder -ReportServerUri $ReportServerUri -Path $fullPath -ErrorAction Stop Write-Verbose "文件夹 $fullPath 已存在,跳过创建" } catch { # 文件夹不存在,创建它 Write-Host "创建文件夹: $fullPath" New-RsFolder -ReportServerUri $ReportServerUri -Path $currentPath -Name $folder -ApiVersion $ApiVersion } # 更新当前路径为下一级的父路径 $currentPath = $fullPath } } # 使用示例:遍历本地备份的报表文件夹,转换为SSRS路径后创建 $localBackupRoot = "C:\SSRS_Backup\Reports" $newReportServerUri = "http://your-new-ssrs-server/ReportServer" # 遍历本地所有子文件夹 Get-ChildItem -Path $localBackupRoot -Directory -Recurse | ForEach-Object { # 将本地路径转换为SSRS格式:去掉根目录,替换\为/,开头加/ $relativePath = $_.FullName.Substring($localBackupRoot.Length) $ssrsFolderPath = "/" + ($relativePath -replace "\\", "/").Trim("/") # 调用递归函数创建文件夹 New-RsFolderRecursive -ReportServerUri $newReportServerUri -TargetFolderPath $ssrsFolderPath }
关键说明
- 路径转换:如果你的本地备份是Windows文件夹结构,一定要把
\替换成SSRS用的/,并调整为相对根目录的格式(开头加/)。 - 权限验证:确保运行脚本的账号在新SSRS服务器上拥有内容管理器或足够的文件夹创建权限,不然会遇到权限报错。
- 错误处理:函数里用
try/catch来检查文件夹是否存在,避免重复创建或者因为已存在而报错。
验证创建结果
你可以用下面的命令检查新服务器上的文件夹结构是否正确:
Get-RsFolderContent -ReportServerUri $newReportServerUri -Path "/" -Recurse | Where-Object { $_.TypeName -eq "Folder" } | Select-Object Path
这样就能完美重建原有的SSRS文件夹层级,再也不用手动一级一级创建啦!
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

