qq_37156213 2023-03-10 18:22 采纳率: 53.3%
浏览 45
已结题

as3调用ps1脚本操作office word报错,最好来个既会as3又会powershell的

一段用powershell操作office word的代码,在这台win7 64位的系统上直接双击ps1脚本文件能正常运行,但是一通过其他语言(actionscript 3)来调用执行就会报错,值得注意的是,在另一台win7 64位电脑上无论直接双击还是用actionscript 3调用都没问题。

已经排除权限问题,值得注意的是,在另一台win10电脑上也遇到同样的报错。

img

# 加载Word应用程序
$word = New-Object -ComObject Word.Application
#$word.visible=$true
# 打开文档
$doc = $word.Documents.Add()
# 设置页面边距
$section = $doc.Sections.Item(1)
$section.PageSetup.LeftMargin = 36
$section.PageSetup.RightMargin = 36
$section.PageSetup.TopMargin = 36
$section.PageSetup.BottomMargin = 36
 #获取文档object
$Section = $doc.Sections.Item(1);
#获取页眉
$Header = $Section.Headers.Item(1);
#获取页脚
$Footer = $Section.Footers.Item(1);
#设置页眉页码
$myDoc=$word.Selection
$myDoc.TypeText("111111")  #processArgs[4]
$myDoc.TypeText("2222222")  #processArgs[5]
$myDoc.TypeText("333
3333")  #processArgs[6]
# 插入空白页
$selection = $word.Selection
$selection.InsertNewPage()
# 将光标移动到文档结尾
$selection.EndKey([Microsoft.Office.Interop.Word.WdUnits]::wdStory)
# 保存并关闭文档
$doc.SaveAs([ref]"C:\myMergeDoc.docx")
$doc.Close()
# 关闭Word应用程序
$word.Quit()

报错内容如下(因为是从flash里面输出的报错信息,所以内容可能会和PS直接输出的有点不一样,主要就是多了几个as3那边的变量,比如process error ,以及process 都是as3的变量可以忽略):

process error :不能对值为空的表达式调用方法。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:5 字符: 27

+ $doc = $word.Documents.Add <<<< ()

process error :    + CategoryInfo          : InvalidOperation: (Add:String) [], RuntimeExcept 

   ion

process error :    + FullyQualifiedErrorId : InvokeMethodOnNull

process error : 

process error :不能对值为空的表达式调用方法。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:7 字符: 30

process error :+ $section = $doc.Sections.Item <<<< (1)

process error :    + CategoryInfo          : InvalidOperation: (Item:String) [], RuntimeExcep 

process error :   tion

process error :    + FullyQualifiedErrorId : InvokeMethodOnNull

process error : 

process error :在此对象上找不到属性“LeftMargin”;请确保该属性存在且可设置。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:8 字符: 20

process error :+ $section.PageSetup. <<<< LeftMargin = 36

process error :    + CategoryInfo          : InvalidOperation: (LeftMargin:String) [], Runtim 

process error :   eException

process error :    + FullyQualifiedErrorId : PropertyNotFound

 

process error :在此对象上找不到属性“RightMargin”;请确保该属性存在且可设置。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:9 字符: 20

process error :+ $section.PageSetup. <<<< RightMargin = 36

process error :    + CategoryInfo          : InvalidOperation: (RightMargin:String) [], Runti 

process error :   meException

process error :    + FullyQualifiedErrorId : PropertyNotFound

process error : 

process error :在此对象上找不到属性“TopMargin”;请确保该属性存在且可设置。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:10 字符: 20

process error :+ $section.PageSetup. <<<< TopMargin = 36

process error :    + CategoryInfo          : InvalidOperation: (TopMargin:String) [], Runtime 

process error :   Exception

process error :    + FullyQualifiedErrorId : PropertyNotFound

 

process error :在此对象上找不到属性“BottomMargin”;请确保该属性存在且可设置。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:11 字符: 20

process error :+ $section.PageSetup. <<<< BottomMargin = 36

process error :    + CategoryInfo          : InvalidOperation: (BottomMargin:String) [], Runt 

process error :   imeException

    + FullyQualifiedErrorId : PropertyNotFound

 

process error :不能对值为空的表达式调用方法。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:13 字符: 30

+ $Section = $doc.Sections.Item <<<< (1);

process error :    + CategoryInfo          : InvalidOperation: (Item:String) [], RuntimeExcep 

process error :   tion

    + FullyQualifiedErrorId : InvokeMethodOnNull

 

process error :不能对值为空的表达式调用方法。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:15 字符: 32

process error :+ $Header = $Section.Headers.Item <<<< (1);

process error :    + CategoryInfo          : InvalidOperation: (Item:String) [], RuntimeExcep 

   tion

    + FullyQualifiedErrorId : InvokeMethodOnNull

process error : 

process error :不能对值为空的表达式调用方法。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:17 字符: 32

+ $Footer = $Section.Footers.Item <<<< (1);

process error :    + CategoryInfo          : InvalidOperation: (Item:String) [], RuntimeExcep 

process error :   tion

process error :    + FullyQualifiedErrorId : InvokeMethodOnNull

 

process error :不能对值为空的表达式调用方法。

所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:20 字符: 16

process error :+ $myDoc.TypeText <<<< ("111111")  #processArgs[4]

process error :    + CategoryInfo          : InvalidOperation: (TypeText:String) [], RuntimeE 

process error :   xception

process error :    + FullyQualifiedErrorId : InvokeMethodOnNull

process error : 

process error :不能对值为空的表达式调用方法。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:21 字符: 16

process error :+ $myDoc.TypeText <<<< ("2222222")  #processArgs[5]

process error :    + CategoryInfo          : InvalidOperation: (TypeText:String) [], RuntimeE 

process error :   xception

process error :    + FullyQualifiedErrorId : InvokeMethodOnNull

process error : 

process error :不能对值为空的表达式调用方法。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:22 字符: 16

process error :+ $myDoc.TypeText <<<< ("333

process error :    + CategoryInfo          : InvalidOperation: (TypeText:String) [], RuntimeE 

   xception

    + FullyQualifiedErrorId : InvokeMethodOnNull

process error : 

process error :不能对值为空的表达式调用方法。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:26 字符: 25

+ $selection.InsertNewPage <<<< ()

process error :    + CategoryInfo          : InvalidOperation: (InsertNewPage:String) [], Run 

process error :   timeException

process error :    + FullyQualifiedErrorId : InvokeMethodOnNull

process error : 

process error :不能对值为空的表达式调用方法。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:28 字符: 18

process error :+ $selection.EndKey <<<< ([Microsoft.Office.Interop.Word.WdUnits]::wdStory)

process error :    + CategoryInfo          : InvalidOperation: (EndKey:String) [], RuntimeExc 

process error :   eption

process error :    + FullyQualifiedErrorId : InvokeMethodOnNull

process error : 

process error :不能对值为空的表达式调用方法。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:30 字符: 12

+ $doc.SaveAs <<<< ([ref]"C:\myMergeDoc.docx")

process error :    + CategoryInfo          : InvalidOperation: (SaveAs:String) [], RuntimeExc 

process error :   eption

    + FullyQualifiedErrorId : InvokeMethodOnNull

process error : 

process error :不能对值为空的表达式调用方法。

process error :所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:31 字符: 11

+ $doc.Close <<<< ()

process error :    + CategoryInfo          : InvalidOperation: (Close:String) [], RuntimeExce 

process error :   ption

process error :    + FullyQualifiedErrorId : InvokeMethodOnNull

process error : 

process error :使用“3”个参数调用“Quit”时发生异常:“无法将类型为“Microsoft.Office.Interop.Word.A

process error :pplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Word._Ap

plication”。此操作失败的原因是对 IID 为“{00020970-0000-0000-C000-000000000046}”

process error :的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 加载类型库/DLL 时出错。 (

异常来自 HRESULT:0x80029C4A (TYPE_E_CANTLOADLIBRARY))。”

所在位置 D:\2023年3月7日_测_as3直接操作ps写word\bin\createWord2.ps1:33 字符: 11

process error :+ $word.Quit <<<< ()

    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException

    + FullyQualifiedErrorId : DotNetMethodException

process error : 


  • 写回答

3条回答 默认 最新

  • 极客智能体-在线 2023-03-10 21:40
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    首先需要确认从ActionScript 3中调用PowerShell运行脚本的部分代码是否正确,因为从报错信息来看,很可能是执行到Add方法时$doc对象为null。

    以下是检查代码的建议:

    1. 确认PowerShell的执行权限及策略,建议打开命令行,执行powershell.exe,尝试执行createWord2.ps1脚本,根据情况选择开启或关闭 Execution Policy。设置执行策略的方法请参考微软官方文档。如果是在管理员模式下双击脚本文件执行,则默认执行策略为Unrestricted,这个一般不需要额外处理。
    2. 确认Powershell脚本的代码无误。可以创建一个新的脚本文件,只包含上述PowerShell代码,然后执行看看是否可以正常运行。
    3. 确认com对象名称是否正确。在PowerShell中使用com对象的时候需要正确的对象名称,正确的方法是打开Word,打开VBA编辑器,查看对象模型中的名称。或者用下面代码来获取对象的完整名称:
      Get-ChildItem HKLM:\SOFTWARE\Classes\TypeLib\ | where { $_.Name -match '^\d|^M' } | Get-ItemProperty | select -Expand Description | select -Unique -OutVariable objDesc ; get-item HKLM:\SOFTWARE\Classes\TypeLib\ | where {
       (get-itemproperty $_.PSPath) -match $objDesc } | get-itemproperty PSPath | select -Expand "(default)"
      
    4. 确认代码是否可以在64位系统中正常运行,比如AS3是否是以64位方式运行。可以尝试将PowerShell脚本中的文档保存路径改为非系统盘符,如D:\myWord.docx,再运行看看是否仍会报错。

    以下是一个ActionScript 3中调用PowerShell运行脚本的示例代码,可以参考:

    var psFile:File = File.desktopDirectory.resolvePath("createWord2.ps1");
    var processInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
    processInfo.executable = File.applicationDirectory.resolvePath("powershell.exe");
    processInfo.arguments = new <String>["-ExecutionPolicy", "Bypass", "-File", psFile.nativePath];
    var psProcess:NativeProcess = new NativeProcess();
    psProcess.addEventListener(NativeProcessExitEvent.EXIT, function (event:NativeProcessExitEvent):void {
        // 处理退出事件,根据需要进行操作
    });
    psProcess.addEventListener(NativeProcessErrorEvent.STANDARD_ERROR_IO_ERROR, function (event:NativeProcessErrorEvent):void {
        // 处理错误事件,根据错误信息进行调整
        trace("process error :", event.text);
    });
    psProcess.start(processInfo);
    

    上述代码中,我们首先通过File类获取PowerShell脚本文件所在的路径,然后定义一个NativeProcessStartupInfo对象,设置可执行文件为PowerShell,同时设置执行参数。最后,创建并启动NativeProcess实例。

    完整的PowerShell脚本代码见下:

    Add-Type -AssemblyName Microsoft.Office.Interop.Word
    $word = New-Object -ComObject Word.Application
    $doc  = $word.Documents.Add()
    $section = $doc.Sections.Item(1)
    $section.PageSetup.LeftMargin = 36
    $section.PageSetup.RightMargin = 36
    $section.PageSetup.TopMargin = 36
    $section.PageSetup.BottomMargin = 36 
    
    $Header = $section.Headers.Item(1)
    $Footer = $section.Footers.Item(1)
    $myDoc = $word.Selection
    $myDoc.TypeText("111111")
    $myDoc.TypeText("2222222")
    $myDoc.TypeText("333
    3333")
    $selection = $word.Selection
    $selection.InsertNewPage()
    $selection.EndKey(6)
    $doc.SaveAs("C:\myMergeDoc.docx")
    $doc.Close()
    $word.Quit()
    

    如果我的回答解决了您的问题,请采纳!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月20日
  • 已采纳回答 3月12日
  • 修改了问题 3月10日
  • 创建了问题 3月10日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助