运行以下 PowerShell 脚本(即为 AX 部署所有 SSRS 报告)出现错误:
$axdllname = "Microsoft.Dynamics.AX.Framework.Management.dll"
$gacfolder = join-path $env:windir "assembly\GAC_MSIL"
$axdll = Get-ChildItem $gacfolder -Recurse -Name $axdllname
$axdll = join-path $gacfolder $axdll
import-module $axdll
Publish-AXReport -ReportName "*" -RestartReportServer
错误信息是:
Publish-AXReport : Name cannot begin with the ' ' character, hexadecimal value 0x20. Line 46, position 8.
At line:1 char:17
+ Publish-AXReport <<<< -ReportName "*" -RestartReportServer
+ CategoryInfo : ParserError: (:) [Publish-AXReport], XmlException
+ FullyQualifiedErrorId : Name cannot begin with the ' ' character, hexadecimal value 0x20. Line 46, position 8.,M
icrosoft.Dynamics.AX.Framework.Management.Reports.PublishReportCommand
遗憾的是,我找不到源代码的副本Publish-AXReport
,因此无法深入探究此异常的来源。
问题
是否有人知道该问题的可能原因,或者我可以采取哪些步骤来找出原因?
更新
我没有运行所有报告,而是*
尝试获取所有报告的列表(单独运行良好/不显示名称以空格开头的报告),然后将其传输到 publish-axreport cmdlet;这意味着现在我可以看到哪些报告产生了该错误。
Get-AxReport -ReportName * | Publish-AXReport
现在可以确定的是,有几份报告(尽管只有一小部分可用报告)在发布时会抛出此错误。其中一份报告是AssetAcquisitionDocumentPL
。
错误似乎仅发生在具有相关程序集的报告中/对于具有相关程序集的报告总是出错;对于没有相关程序集的报告从不出错。
如果运行,也会出现同样的问题Get-AXReportServerConfiguration | %{Publish-AXAssembly -id $_.ConfigurationId -vsprojectname 'assetAcquisitionDocumentPL.BusinessLogic'}
使用开关运行上述-verbose
程序表明,在将假设从临时目录复制到 SSRS bin 目录之后的某个时间点会发生错误。
答案1
报告名称中似乎有空格(十六进制 0x20),这导致了错误。请检查脚本和/或报告名称以删除空格。
行 46,位置 8
答案2
本主题中解决的问题:https://community.dynamics.com/ax/f/33/t/190841
根本原因
文件D:\Program Files\Microsoft SQL Server\MSRS11.AX2012_ENVIRON1\Reporting Services\ReportServer\rssrvpolicy.config
在左括号和其中一个元素名称之间包含一个空格;即< CodeGroup ...>
而不是<CodeGroup ...>
。
纠正这个拼写错误就解决了这个问题。
(我不知道这个空格是怎么进入文件的/除非我们再次看到这个问题,否则我怀疑我会找到答案)。
发现原因的步骤
如果有人遇到类似的问题但原因不同,以下是我们发现该问题的详细说明:
- 下载并提取进程监视器:https://technet.microsoft.com/en-us/sysinternals/processmonitor.aspx
- 关闭所有不需要的进程/服务(以减少噪音)
Microsoft Dynamics AX 2012 Management Shell
以管理员身份打开- 键入生成错误的命令(
Publish-AXAssembly -id 'SSRSNLBAOS2' -vsprojectname 'assetAcquisitionDocumentPL.BusinessLogic' -verbose
);选择在出现错误之前执行的工作最少的命令(以减少噪音)。 - 打开进程监视器
- 运行命令
- 出现错误时,点击进程监视器中的“保存”将会话保存到 PML 文件。
- 关闭进程监视器和 powershell
- 打开 PML 文件并按进程名称进行过滤
powershell.exe
- 寻找有趣的事件。我怀疑是 XML 文件,因此查看了文件末尾附近的文件访问事件。
- 由于我之前见过 XML 文件的类似问题,因此将重点放在 XML(格式)文件上/尝试解析它们以查看哪个出现错误(
[xml][string](get-content 'd:\some\path\to\a\file.config')
)。 - 当文件无法解析或出现有关无效空格字符的错误时,那就是罪魁祸首文件。
- 然后,我在文本编辑器中打开该文件,并借助语法高亮立即发现了错误。
- 更正文件、保存,然后通过再次解析确认这是文件中唯一的错误,从而使文件处于良好状态。
- 然后,我重新运行该
Publish-AXAssembly ...
命令(不运行进程监视器)以查看问题是否已解决 - 确实已解决。
感谢 Dynamics 社区的 @BrandonWiese 的帮助。