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

【问题】无法通过SAP系统外部OS命令(SM69)执行OS服务器上Powershell文件对Office文档的相关命令操作(打开文档等命令)。

【现象】执行外部OS命令的程序被挂起,迟迟没有响应(进程无法结束)。

【解决方法】建立文件夹:C:\windows\syswow64\config\systemprofile\Desktop 

PowerShell程序功能:对指定的Word文档执行密码保护操作。

执行的PowerShell程序代码如下:

 Param(
[string]$filePath, #Word文档地址(通过SAP程序赋予值)
[string]$newpassword #给Word文档设定的密码(通过SAP程序赋予值)
) $ErrorActionPreference = "STOP"
$Word = $null try{
#启动Word应用
     $Word.visible = $false

     #打开指定Word文档
$doc = $Word.documents.Open($filePath)
$doc.Activate() #设定密码
$doc.Protect(3,[ref]$true,[ref]$newpassword) #关闭文档
$doc.Close()
Write-Host 0 }catch{
$error[0]
Write-Host 255 }finally{
Write-Host "finally"
#Start-Sleep 2 #关闭Word应用
$Word.Quit() #"BulletProofOnCorruption"
#(Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Office\16.0\Word\Options\').BulletProofOnCorruption
#"BulletProofOnCorruption" [System.Runtime.InteropServices.Marshal]::ReleaseComObject($Word) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
#Remove-Variable $Word
}

【解决思路】

通过插入$error[0] >> C:/Document/ps_error.txt;(路径可以自定义,需确保路径中的文件夹存在)

打开 C:/Document/ps_error.txt,便可以检查该程序执行时问题出在哪里:

 catch{
$error[0] > C:/Document/ps_error.txt;
Write-Host 255
}

我这边的错误日志显示的是$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应用程序的自动化)也会遇到同样的现象,

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

Documents.Open返回值为null的更多相关文章

  1. 解决 XMLHttpRequest status = 0 问题 及 返回值为null问题

    1.XMLHttpRequest status = 0 问题 XMLHttpRequest的说明:http://www.w3.org/TR/XMLHttpRequest/ . The status a ...

  2. SPFarm.local返回值为null

    创建了一个控制台应用程序,想输出SP2010服务器场下所有对象模型信息,结果:SPFarm.local返回值为null. 经查询解决方法: 1 .net framework版本要使用3.5: 2 目标 ...

  3. .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)

    最近在项目中与别的公司对接业务,对方是Java语言,需要调用对方的WebServices,结果常规的添加web引用的方法可以传过去值,但是返回值为null 查了很多资料,没有解决方法 思考应该是.Ne ...

  4. spring jdbcTemplate query 返回值为null

    spring jdbcTemplate query 返回值为null 今天使用以下方法从数据库中查询数据,返回列表 public List<BookBean> getBooks(){ St ...

  5. IOS开发中返回值为null时的处理

    在IOS开发中,如果得到了null返回值很容易造成程序崩溃,null和nil的判断方法不同. nil的判断方法: if(data==nil) {      NSLog(@"data is n ...

  6. 关于递归函数返回值为null的问题

    public function gettopcateid($cate_id){ $pid=db('cate')->where('cate_id',$cate_id)->find(); if ...

  7. SpringBoot中配置不序列化返回值为null的属性

    package com.weiresearch.properties; import com.fasterxml.jackson.annotation.JsonInclude;import com.f ...

  8. MyBatis resultType用Map 返回值中有NULL则缺少字段 返回值全NULL则map为null

    这个问题我大概花了2个小时才找到结果 总共需要2个设置 这里是对应springboot中的配置写法 @select("select sum(a) a,sum(b) b from XXX wh ...

  9. struts下ajax提交与页面进行提示 返回值为null

    @Override    public String execute() throws Exception {        if ("none".equals(task)) {  ...

随机推荐

  1. 论文阅读 | Towards a Robust Deep Neural Network in Text Domain A Survey

    摘要 这篇文章主要总结文本中的对抗样本,包括器中的攻击方法和防御方法,比较它们的优缺点. 最后给出这个领域的挑战和发展方向. 1 介绍 对抗样本有两个核心:一是扰动足够小:二是可以成功欺骗网络. 所有 ...

  2. 用vs2008打开sln项目总是说没有对应的,打不开vs2008的工程文件提示不支持项目类型(.csproj)

    找了很多解决办法都搞不定,最后找了个老司机问了一下,原来是组件没有安装完整!!!只是安装了个vs2008的外壳...下次先检查开发工具是否完整!下载安装包安装vs再说吧!

  3. luoguP3390(矩阵快速幂模板题)

    链接:https://www.luogu.org/problemnew/show/P3390 题意:矩阵快速幂模板题,思路和快速幂一致,只需提供矩阵的乘法即可. AC代码: #include<c ...

  4. 设计模式:策略模式(Stratege)

    首先我们需要知道策略模式与状态模式是如此的相似,就犹如一对双胞胎一样.只不过状态模式是通过改变对象内部的状态来帮助对象控制自己的行为,而策略模式则是围绕可以互换的算法来创建成功业务的.两者都可用于解决 ...

  5. NOIP 2017 逛公园 题解

    题面 这道题是一道不错的计数类DP: 首先我们一定要跑一遍dijkstra来求得每个点到1号点的最短路: 注意题干,题中并没有说所有点都可以到达n好点,只说了存在一条1号点到n号点的路径:所以我们在反 ...

  6. [LGP5115] Check,Check,Check one two!

    神奇的思路,还是要学习一个. 题意:给你一个字符串,并定义两个前缀的lcs.两个后缀的lcp,求式子膜\(2^{64}\)的值. \[ \sum_{1\le i<j\le n} lcp(i,j) ...

  7. 检测Python程序本身是否已经在运行

    为runner.py实现一个函数,检测是否有其他的runner.py进程在正在执行? 除主要用到os模块,还用到了第三方模块psutil

  8. JAVA break、continue和return的区别

    控制跳转:continue和break的区别,以为return Continue在循环中使用,一般在for中使用 Break:跳出单重循环,常和switch搭配使用. 效果区别 Break的结果如下: ...

  9. Mysql8 root密码忘记了

    需要确定自己的mysql版本是否是8 [root@smonitor ~]# mysql --version mysql Ver 8.0.13 for Linux on x86_64 (MySQL Co ...

  10. Nginx负载均衡调度算法

    Nginx支持的负载均衡调度算法方式如下: 1. weight轮询(默认) 接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列 ...