使用Powershell在远程计算机上运行脚本

时间:2014-06-05 10:38:03

标签: session powershell command-line runtimeexception

我的任务是创建一个可以从命令提示符运行的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

但是后来我被要求也允许这个脚本在远程计算机上运行。所以我已经开始研究这个功能,并且能够创建另一个电源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

哪个也有效,并且help命令的结果会回显给本地PC。因此,下一步是简单地更改$ Script变量以包含我希望运行的命令,以便将Word文档转换为PDF,如下所示......

$Script = {powershell.exe -ExecutionPolicy ByPass -file c:\SaveToPDF.ps1}

然而,这会产生一个错误(见下文),在远程PC上运行时看到脚本的工作原理并没有多大意义......

您无法在空值表达式上调用方法。

  • CategoryInfo:NotSpecified :(你不能调用... ued expression.:String)[],remoteException
  • FullyQualifiedErrorId:NativeCommandError

在C:\ SaveToPDF.ps1:4 char:12

  • $ doc.SaveAs<<<< ([ref]" c:\ test.pdf",[ref] 17)

    • CategoryInfo:InvalidOperation :( saveas:String)[],RuntimeException
    • FullyQualifiedErrorId:InvokeMethodOnNull

您无法在空值表达式上调用方法。

在C:\ SaveToPDF.ps1:5 char:11

  • $ doc.Close<<<< ()

    • CategoryInfo:InvalidOperation :( Close:String)[],RuntimeException
    • FullyQualifiedErrorId:InvokeMethodOnNull

我甚至尝试将power shell脚本命令直接包含在远程处理脚本中,如下所示......

$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都具有读写访问权限的网络位置,我仍然得到相同的错误集。

所以在这一点上,我来找你们,看看你是否能让我知道我错过了什么。

希望你能帮忙

由于

卡尔

1 个答案:

答案 0 :(得分:0)

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

我真的想用引用来支持这一点,但是我没有任何东西......