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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:05:39