使用PowerBIPS自动上传CSV至PowerBI遇PlatformParameters构造函数报错
解决PowerBIPS模块中"Cannot find an overload for 'PlatformParameters' and the argument count: '1'"错误
这个错误的核心原因是PowerBIPS模块依赖的ADAL(Microsoft.IdentityModel.Clients.ActiveDirectory)库版本不兼容,模块内部调用的PlatformParameters构造函数参数和你环境中安装的ADAL版本要求不匹配。以下是分步解决方法:
1. 检查并适配ADAL库版本
PowerBIPS 2.x版本通常和ADAL 2.28.4版本兼容,你可以按以下步骤操作:
- 先查看当前安装的ADAL版本:
Get-Module -ListAvailable Microsoft.IdentityModel.Clients.ActiveDirectory - 如果版本不是2.28.4,卸载旧版本并安装兼容版本:
# 卸载旧版本 Uninstall-Module -Name Microsoft.IdentityModel.Clients.ActiveDirectory -Force # 安装指定兼容版本 Install-Module -Name Microsoft.IdentityModel.Clients.ActiveDirectory -RequiredVersion 2.28.4 -Force
2. 手动指定认证令牌,绕过模块默认认证流
模块默认的认证逻辑可能在你的环境中参数传递有误,手动获取认证令牌再传递给Out-PowerBI可以规避这个问题:
第一步:配置认证参数并获取令牌
替换下面的占位符(客户端ID、租户ID、账号密码)为你的实际信息:
$clientId = "你的PowerBI应用客户端ID" $tenantId = "你的Azure AD租户ID" $username = "你的PowerBI登录账号" $password = ConvertTo-SecureString "你的账号密码" -AsPlainText -Force # 创建凭证对象 $credentials = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.UserPasswordCredential($username, $password) # 创建认证上下文 $authContext = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext("https://login.microsoftonline.com/$tenantId")
第二步:修改你的循环代码,传递令牌
把原来的Out-PowerBI调用加上-AccessToken参数,更新后的完整代码如下:
# 先配置认证参数 $clientId = "你的PowerBI应用客户端ID" $tenantId = "你的Azure AD租户ID" $username = "你的PowerBI登录账号" $password = ConvertTo-SecureString "你的账号密码" -AsPlainText -Force $credentials = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.UserPasswordCredential($username, $password) $authContext = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext("https://login.microsoftonline.com/$tenantId") while ($true) { # 每次循环重新获取令牌(避免令牌过期) $authResult = $authContext.AcquireTokenAsync("https://analysis.windows.net/powerbi/api", $clientId, $credentials).Result # 遍历CSV文件并上传 Get-ChildItem "$currentPath\CSVData" -Filter "*.csv" | ForEach-Object { $file = $_ # 导入CSV并添加文件名列 $data = Import-Csv $file.FullName | Select-Object @{Label="File";Expression={$file.Name}}, * # 传递令牌上传数据到PowerBI $data | Out-PowerBI -DataSetName "CSVSales" -TableName "Sales" -Types @{ "Sales.OrderDate" = "datetime"; "Sales.SalesAmount" = "double"; "Sales.Freight" = "double" } -BatchSize 300 -AccessToken $authResult.AccessToken -Verbose # 归档文件 Move-Item $file.FullName "$currentPath\CSVData\Archive\" -Force } Write-Output "Sleeping..." Start-Sleep -Seconds 5 }
3. 如果你使用MFA(多因素认证)账号
如果你的PowerBI账号开启了MFA,不能用密码认证,需要改用交互式认证:
# 创建交互式平台参数 $platformParams = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters([Microsoft.IdentityModel.Clients.ActiveDirectory.PromptBehavior]::Auto) # 获取令牌(会弹出登录窗口) $authResult = $authContext.AcquireTokenAsync("https://analysis.windows.net/powerbi/api", $clientId, New-Object Uri("http://localhost"), $platformParams).Result
然后同样把$authResult.AccessToken传递给Out-PowerBI即可。
为什么会出现这个错误?
PowerBIPS模块内部的认证代码中,调用New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters(1)(只传1个参数),但较新的ADAL版本中,PlatformParameters的构造函数要求至少2个参数,导致参数不匹配抛出错误。通过指定认证令牌或者回退到兼容的ADAL版本,就能解决这个问题。
内容的提问来源于stack exchange,提问作者Grant Collins
相关产品推荐
相关产品推荐

