【问题标题】:Using Power Shell to run scripts on a remote computer使用 Powershell 在远程计算机上运行脚本
【发布时间】: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


【解决方案1】:

很遗憾,您无法使用Invoke-CommandEnter-PSSession 创建comobject word.application。 Word 或任何其他 Office 产品依赖于 GUI 环境来启动其二进制文件。

我真的很想用引用来支持这一点,但可惜我什么都没有..

【讨论】:

  • 脚本确实打开了Word,用远程PC上的任务管理器来判断就够了,但运行不正常,实际上只是不断消耗越来越多的内存,直到删除 PC 崩溃。它支持办公室在 GUI 环境中按预期工作的需要。除非有人有其他想法,否则我现在准备放弃这个......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 2015-11-06
  • 1970-01-01
相关资源
最近更新 更多