【发布时间】:2014-07-26 07:33:19
【问题描述】:
我的任务是创建一个可以从命令提示符运行的 power shell 脚本,该脚本将利用 Microsoft Word (2013) 打开指定的 Word 文档并将其保存为 PDF 文档。
第一次使用 PowerShell,但我成功地创建了一个简短的脚本来完成这项工作,如下...
$word=new-object -comobject word.application
$doc=$word.documents.Open("c:\TEST.docx")
$doc.SaveAs([ref]"c:\test.pdf", [ref]17)
$doc.Close()
$word.Quit()
使用以下命令运行时,曾经保存为 ps1 文件效果很好……
powershell.exe -ExecutionPolicy ByPass -file c:\SaveToPDF.ps1
但是,我随后也被要求允许在远程计算机上运行此脚本。所以我已经开始研究这个功能,并且已经能够创建另一个 power shell 脚本,它将在远程计算机上运行命令行作业,如下所示,它将运行帮助命令
$Username = "Username"
$Password = "PWD123"
$ComputerName = "PC-RemoteApps"
$Script = {help}
$SecurePassWord = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $Username, $SecurePassWord
$Session = New-PSSession -ComputerName $ComputerName -credential $Cred
$Job = Invoke-Command -Session $Session -Scriptblock $Script
echo $Job
Remove-PSSession -Session $Session
这同样有效,帮助命令的结果回显到本地 PC。因此,下一步就是简单地更改 $Script 变量以包含我希望运行的命令,以将 Word 文档转换为 PDF,如下所示……
$Script = {powershell.exe -ExecutionPolicy ByPass -file c:\SaveToPDF.ps1}
但是,这会产生一个错误(见下文),看脚本在远程 PC 上运行时的工作方式并没有多大意义……
您不能在空值表达式上调用方法。
- CategoryInfo : NotSpecified: (你不能调用...ued 表达式.:String) [], remoteException
- FullyQualifiedErrorId : NativeCommandError
在 C:\SaveToPDF.ps1:4 char:12
-
$doc.SaveAs
- CategoryInfo : InvalidOperation: (saveas:String) [], RuntimeException
- FullyQualifiedErrorId : InvokeMethodOnNull
您不能在空值表达式上调用方法。
在 C:\SaveToPDF.ps1:5 char:11
-
$doc.关闭
- CategoryInfo : InvalidOperation: (Close:String) [], RuntimeException
- FullyQualifiedErrorId:InvokeMethodOnNull
我什至尝试过将power shell script命令直接包含在远程处理脚本中,如下……
$Script = {
$word=new-object -comobject word.application
$doc=$word.documents.Open("c:\TEST.docx")
$doc.SaveAs([ref]"c:\test.pdf", [ref]17)
$doc.Close()
$word.Quit()
}
我仍然在哪里得到一个错误,基本上告诉我同样的事情,如下......
您不能在空值表达式上调用方法。
- CategoryInfo : InvalidOperation: (SaveAs:String) [], RuntimeException
- FullyQualifiedErrorId : InvokeMethodOnNull
您不能在空值表达式上调用方法。
- CategoryInfo : InvalidOperation: (Close:String) [], RuntimeException
- FullyQualifiedErrorId:InvokeMethodOnNull
在我看来 $doc 变量没有设置任何值,因此无法调用 SaveAs() 和 Close() 方法。然而,源文件(“c:\TEST.docx”)存在于远程 PC 上的此位置,并且在远程 PC 上运行时,这些命令运行正常。
我什至将测试文件移动到本地和远程 PC 都具有读写访问权限的网络位置,但我仍然遇到相同的错误集。
所以在这一点上,我来找你们,看看你们能否让我知道我错过了什么。
希望你能帮忙
谢谢
卡尔
【问题讨论】:
-
您能否检查一下您的 $doc 变量是否已被 open 调用填充。由于我们在远程会话中工作,我怀疑 Word 是否可以在没有用户会话的情况下正常工作。通常,当我们想要在计算机边界上进行与办公室相关的操作时,我们会使用像 ASPose 或类似的库,以避免需要在任何地方安装 Word 或 Excel...
-
是的,远程运行时 $doc 变量为空,这就是为什么我认为它会引发错误。
-
您能否详细说明“没有用户会话”的含义,因为脚本创建的会话使用有效的用户凭据等,或者我应该在脚本中包含更多内容吗?打开用户会话?
标签: session powershell command-line runtimeexception