上个月出现的一个问题,将解决方法记录一下~
【问题】无法通过SAP系统外部OS命令(SM69)执行OS服务器上Powershell文件对Office文档的相关命令操作(打开文档等命令)。
【现象】执行外部OS命令的程序被挂起,迟迟没有响应(进程无法结束)。
【解决方法】建立文件夹:C:\windows\syswow64\config\systemprofile\Desktop
PowerShell程序功能:对指定的Word文档执行密码保护操作。
执行的PowerShell程序代码如下:
1 Param( 2 [string]$filePath, #Word文档地址(通过SAP程序赋予值) 3 [string]$newpassword #给Word文档设定的密码(通过SAP程序赋予值) 4 ) 5 6 $ErrorActionPreference = "STOP" 7 $Word = $null 8 9 try{ 10 #启动Word应用 11
12 $Word.visible = $false 13 14 #打开指定Word文档 15 $doc = $Word.documents.Open($filePath) 16 $doc.Activate() 17 18 #设定密码 19 $doc.Protect(3,[ref]$true,[ref]$newpassword) 20 21 #关闭文档 22 $doc.Close() 23 Write-Host 0 24 25 }catch{ 26 $error[0] 27 Write-Host 255 28 29 }finally{ 30 Write-Host "finally" 31 #Start-Sleep 2 32 33 #关闭Word应用 34 $Word.Quit() 35 36 #"BulletProofOnCorruption" 37 #(Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Office\16.0\Word\Options\').BulletProofOnCorruption 38 #"BulletProofOnCorruption" 39 40 41 [System.Runtime.InteropServices.Marshal]::ReleaseComObject($Word) | Out-Null 42 [System.GC]::Collect() 43 [System.GC]::WaitForPendingFinalizers() 44 #Remove-Variable $Word 45 }
【解决思路】
通过插入$error[0] >> C:/Document/ps_error.txt;(路径可以自定义,需确保路径中的文件夹存在)
打开 C:/Document/ps_error.txt,便可以检查该程序执行时问题出在哪里:
1 catch{ 2 $error[0] > C:/Document/ps_error.txt; 3 Write-Host 255 4 }
我这边的错误日志显示的是$doc.Activate()返回值为空(null)。
由于 $doc = $Word.documents.Open($filePath),也就是说:
$Word.documents.Open($filePath)返回值为null
在程序被挂起之际,由于在资源管理器中可以看见Microsoft Word应用有在启动,所以可以确定$Word的值没有问题。
另外通过插入$filePath > C:/Document/ps_filePath.txt;(路径可以自定义,需确保路径中的文件夹存在)
确定$filePath的值确实有被赋予进来。
$filePath > C:/Document/ps_filePath.txt;
因此问题便出在documents.Open上,该命令没有被正常执行。
查了许多的资料,这种功能(通过非交互式客户端应用程序进行Microsoft Office应用程序的“自动化”)似乎不被微软所支持。
https://support.microsoft.com/zh-cn/help/257757/considerations-for-server-side-automation-of-office
而在网上许多类似的问题(Documents.Open returns null),
最为有效的解决方式就是建立虚拟桌面文件夹:
C:\windows\syswow64\config\systemprofile\Desktop
32位系统的话可能是
C:\windows\system32\config\systemprofile\Desktop
虽然不清楚是什么原理,但是问题成功解决了,目前也没有发现有什么其他负面影响。
另外,如果SAP ERP有用到WWI功能的话,WWI(SP41以上)会自动生成该Desktop文件夹。
估计非SAP产品在用到这类功能(通过非交互式客户端应用程序进行Microsoft Office应用程序的自动化)也会遇到同样的现象,
或许可以尝试一下这种办法。