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 : 


以下答案由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()

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

参考GPT和自己的思路:该 PowerShell 脚本在另一台电脑上可以正常运行,但是在其他语言中调用时出现错误。出现的错误主要是脚本中的对象属性不存在或值为空。

首先,为了更好地调试代码,建议在 PowerShell 脚本中添加必要的错误检查和日志记录。在脚本开头添加以下代码:

# 强制在代码执行期间发生错误时停止脚本
$ErrorActionPreference = "Stop"

# 将日志输出到文本文件
$LogPath = "C:\myScript.log"
Start-Transcript -Path $LogPath -Append


此外,您可以在 PowerShell ISE 中运行该脚本,并使用断点和调试器单步执行脚本,以便更容易地找到问题所在。

现在,让我们看一下报错的具体内容:

1 "不能对值为空的表达式调用方法"
这个错误通常出现在对象为 null 或未正确初始化时。在这个例子中,可能是 $word 或 $doc 对象没有正确初始化,导致在调用它们的方法时出错。

2 "在此对象上找不到属性"
这个错误出现在您尝试在对象上访问不存在的属性时。在这个例子中,可能是因为 $section 对象没有正确初始化,导致在尝试访问其属性时出现错误。

建议您使用 if 语句检查对象是否为空,并在脚本中添加必要的错误处理程序。例如:

if ($word -eq $null) {
    throw "Word application is not initialized."
}


您还可以使用 Try/Catch 块捕获脚本中出现的任何异常并输出错误消息。例如:

Try {
    # Your script code here
}
Catch {
    Write-Error $_
    Exit 1
}


这将捕获脚本中的任何异常并输出错误消息,然后使用 Exit 退出脚本。这将有助于您更好地调试脚本并找到问题所在。

最后,建议您在 AS3 代码中使用 try/catch 块来捕获 PowerShell 脚本的输出和错误。这将有助于您更好地调试和处理脚本执行期间出现的任何问题。

参考GPT的回答和自己的思路,根据报错信息,可以看出脚本在其他系统或语言调用时无法正确加载和操作 Word 应用程序,具体原因可能是与系统和语言环境相关的 COM 组件或权限问题。

以下是可能的解决方法:

1.确保目标系统中已安装 Microsoft Office Word。如果没有安装,需要先安装对应版本的 Word 才能在该系统中运行 PowerShell 脚本。

2.尝试在其他语言中使用相同的 COM 对象创建代码,例如使用 VBA 或 C# 等语言来创建 Word 文档。这可以帮助排除与 PowerShell 或操作系统相关的问题,以确定问题是由 COM 组件引起的。

3.如果尝试使用其他语言创建 Word 文档仍然无法解决问题,则可能需要查看目标系统的 COM 组件是否已正确注册。可以使用 PowerShell 的 Get-CimInstance 命令或 regedit 注册表编辑器来检查注册表中是否存在正确的 COM 组件条目。如果没有正确注册,可以尝试重新注册该组件,或将组件所在目录添加到系统的环境变量 PATH 中。

4.最后,还可以尝试在 PowerShell 脚本中添加更多的错误处理代码,例如使用 try-catch 语句来捕获错误并输出更具体的错误信息。这有助于更好地理解脚本中可能存在的问题,并更好地解决问题。