Documents.Open返回值为null

上个月出现的一个问题,将解决方法记录一下~

 

【问题】无法通过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的值没有问题。

Documents.Open返回值为null

 

另外通过插入$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应用程序的自动化)也会遇到同样的现象,

或许可以尝试一下这种办法。

上一篇:ABP 关闭审计日志


下一篇:不管你是不是IT都能解决电脑越来越卡的问题(图文解析)