PowerShell脚本参数配置咨询:Power BI报告复制脚本参数输入位置
PowerBI报表内容复制脚本参数说明与使用指南
参数输入位置
你不需要修改脚本本身的代码,这些参数是在PowerShell中调用函数时通过命令行参数传递的,常用两种方式:
方式1:直接在命令行传入参数
打开PowerShell,先加载脚本(运行 . .\Copy-PowerBIReportContentToBlankPBIXFile.ps1),再执行类似以下命令:
Copy-PowerBIReportContentToBlankPBIXFile -SourceReportId "12345678-1234-1234-1234-123456789012" -SourceWorkspaceId "12345678-1234-1234-1234-123456789012" -TargetWorkspaceId "12345678-1234-1234-1234-123456789012" -OutFile "C:\Reports\报表副本.pbix"
方式2:编写调用脚本(适合重复使用)
新建一个.ps1文件,写入以下内容(替换为你的实际ID):
# 加载脚本 . .\Copy-PowerBIReportContentToBlankPBIXFile.ps1 # 调用函数并传入参数 Copy-PowerBIReportContentToBlankPBIXFile -SourceReportId "你的源报表ID" ` -SourceWorkspaceId "你的源工作区ID" ` -TargetWorkspaceId "你的目标工作区ID" ` -OutFile "本地保存路径"
运行该脚本即可。
如何获取所需的ID值
- 工作区ID(SourceWorkspaceId/TargetWorkspaceId):打开PowerBI服务进入对应工作区,浏览器地址栏中
groups/后面的一串GUID就是工作区ID。 - 报表ID(SourceReportId):打开要复制的源报表,浏览器地址栏中
reports/后面的一串GUID就是报表ID。 - TargetReportId(可选):如果不指定该参数,脚本会自动上传空白PBIX文件到目标工作区并生成新的报表ID,无需手动获取。
脚本中文注释版本
<# .SYNOPSIS 函数:Copy-PowerBIReportContentToBlankPBIXFile 作者:@JamesDBartlett3 (James D. Bartlett III) .DESCRIPTION - 该脚本会将已发布的PowerBI报表内容复制到一个从空白PBIX发布的新报表中 - 解决了网页端创建的PowerBI报表无法从PowerBI服务下载为PBIX文件的问题 .PARAMETER SourceReportId 要复制的源报表ID .PARAMETER SourceWorkspaceId 源报表所在工作区的ID .PARAMETER TargetReportId 要复制到的目标报表ID(可选) .PARAMETER TargetWorkspaceId 目标报表所在工作区的ID(默认与源工作区相同) .PARAMETER BlankPbix 空白PBIX文件的本地路径或URL(脚本会自动下载空白文件,无需手动准备) .PARAMETER OutFile 新PBIX文件的本地保存路径 .EXAMPLE Copy-PowerBIReportContentToBlankPBIXFile -SourceReportId "12345678-1234-1234-1234-123456789012" -SourceWorkspaceId "12345678-1234-1234-1234-123456789012" -TargetWorkspaceId "12345678-1234-1234-1234-123456789012" .NOTES 该函数不需要Azure AD应用注册、服务主体创建或其他特殊配置,仅需满足: - 用户能运行PowerShell,并安装MicrosoftPowerBIMgmt模块(未安装会自动提示) - 用户拥有下载PBIX文件的权限(查看PowerBI管理门户的"下载报表"设置) - 用户在源和目标工作区拥有"参与者"或更高权限 待办事项 - 测试优化 - 添加更多使用说明和示例 - 重命名函数使其更贴合当前功能 致谢 该PowerShell函数灵感来自PowerBI领域专家Mathias Thierbach的博客文章 推荐使用他的pbi-tools进行PowerBI版本控制 #> Function Copy-PowerBIReportContentToBlankPBIXFile { #Requires -PSEdition Core #Requires -Modules MicrosoftPowerBIMgmt [CmdletBinding()] Param( [parameter(Mandatory = $true)][string]$SourceReportId, [parameter(Mandatory = $true)][string]$SourceWorkspaceId, [parameter(Mandatory = $false)][string]$TargetReportId, [parameter(Mandatory = $false)][string]$TargetWorkspaceId = $SourceWorkspaceId, [Parameter(Mandatory = $false)][string]$BlankPbix, [Parameter(Mandatory = $false)][string]$OutFile ) $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" [string]$blankPbixTempFile = Join-Path -LiteralPath $env:TEMP -ChildPath "blank.pbix" [array]$validPbixContents = @("Layout", "Metadata") [bool]$blankPbixIsUrl = $BlankPbix.StartsWith("http") [bool]$localFileExists = Test-Path $BlankPbix [bool]$remoteFileIsValid = $false [bool]$localFileIsValid = $false [bool]$defaultFileIsValid = $false Function FileIsBlankPbix($file) { $zip = [System.IO.Compression.ZipFile]::OpenRead($file) $fileIsPbix = @($validPbixContents | Where-Object {$zip.Entries.Name -Contains $_}).Count -gt 0 $fileIsBlank = (Get-Item $file).length / 1KB -lt 20 $zip.Dispose() if($fileIsPbix -and $fileIsBlank) { Write-Debug "$file 是有效的空白PBIX文件。" return $true } else { Write-Error "$file 不是有效的空白PBIX文件。" return $false } } # 如果未指定目标报表ID,则使用空白PBIX文件 if(!$TargetReportId) { # 如果用户指定了文件URL,下载并验证是否为空白PBIX if ($blankPbixIsUrl){ Write-Debug "正在下载文件: $BlankPbix..." Invoke-WebRequest -Uri $BlankPbix -OutFile $blankPbixTempFile Write-Debug "正在验证下载的文件..." $remoteFileIsValid = FileIsBlankPbix($blankPbixTempFile) } # 如果用户指定了本地文件路径,验证是否为空白PBIX elseif ($localFileExists) { Write-Debug "正在验证用户提供的文件: $BlankPbix..." $localFileIsValid = FileIsBlankPbix($BlankPbix) } # 如果用户未指定空白PBIX文件,检查临时目录中是否存在有效空白PBIX elseif (Test-Path $blankPbixTempFile) { Write-Debug "正在验证临时目录中的PBIX文件: $blankPbixTempFile..." $defaultFileIsValid = FileIsBlankPbix($blankPbixTempFile) } # 如果用户未指定空白PBIX文件且临时目录中没有,从GitHub下载并验证 else { Write-Debug "正在从GitHub下载空白PBIX文件到 $blankPbixTempFile..." $BlankPbixUri = "https://github.com/JamesDBartlett3/PowerBits/raw/main/Misc/blank.pbix" Invoke-WebRequest -Uri $BlankPbixUri -OutFile $blankPbixTempFile $defaultFileIsValid = FileIsBlankPbix($blankPbixTempFile) } # 如果下载的文件有效,使用该文件 if ($remoteFileIsValid -or $defaultFileIsValid) { $BlankPbix = $blankPbixTempFile } # 如果无法获取有效空白PBIX文件,抛出错误 if (!$TargetReportId -and !$localFileIsValid -and !$remoteFileIsValid -and !$defaultFileIsValid) { Write-Error "未指定TargetReportId且未找到有效空白PBIX文件,请指定其中一项。" return } [bool]$pbixIsValid = ($localFileIsValid -or $remoteFileIsValid -or $defaultFileIsValid) } try { $headers = Get-PowerBIAccessToken } catch { Write-Output "需要PowerBI访问令牌,正在启动身份验证对话框..." Start-Sleep -s 1 Connect-PowerBIServiceAccount -WarningAction SilentlyContinue | Out-Null $headers = Get-PowerBIAccessToken } finally { Write-Debug "目标报表ID为空: $(!$TargetReportId)" $pbiApiBaseUri = "https://api.powerbi.com/v1.0/myorg" # 如果获得有效空白PBIX,发布到目标工作区 if ($pbixIsValid) { Write-Debug "正在将 $BlankPbix 发布到目标工作区..." $publishResponse = New-PowerBIReport -Path $BlankPbix -WorkspaceId $TargetWorkspaceId -ConflictAction CreateOrOverwrite Write-Debug "响应: $publishResponse" $TargetReportId = $publishResponse.Id } # 组装UpdateReportContent API地址和请求体 $updateReportContentEndpoint = "$pbiApiBaseUri/groups/$TargetWorkspaceId/reports/$TargetReportId/UpdateReportContent" $body = @" { "sourceReport": { "sourceReportId": "$SourceReportId", "sourceWorkspaceId": "$SourceWorkspaceId" }, "sourceType": "ExistingReport" } "@ # 更新目标报表内容为源报表内容 $headers.Add("Content-Type", "application/json") $response = Invoke-RestMethod -Uri $updateReportContentEndpoint -Method POST -Headers $headers -Body $body # 如果未指定输出文件,使用源报表名称 $sourceReportName = (Get-PowerBIReport -Id $SourceReportId -WorkspaceId $SourceWorkspaceId).Name $OutFile = $OutFile ?? "$($sourceReportName)_Clone.pbix" # 导出目标报表为PBIX文件 Export-PowerBIReport -WorkspaceId $TargetWorkspaceId -Id $response.id -OutFile $OutFile # 组装数据集API地址 $datasetsEndpoint = "$pbiApiBaseUri/groups/$TargetWorkspaceId/datasets" } }
内容的提问来源于stack exchange,提问作者user6569097
相关产品推荐
相关产品推荐

