一段用powershell操作office word的代码,在这台win7 64位的系统上直接双击ps1脚本文件能正常运行,但是一通过其他语言(actionscript 3)来调用执行就会报错,值得注意的是,在另一台win7 64位电脑上无论直接双击还是用actionscript 3调用都没问题。
已经排除权限问题,值得注意的是,在另一台win10电脑上也遇到同样的报错。
# 加载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。
以下是检查代码的建议:
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)"
以下是一个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 语句来捕获错误并输出更具体的错误信息。这有助于更好地理解脚本中可能存在的问题,并更好地解决问题。