我很确定这一定是某种奇怪的权限问题,但是我找不到任何有效的方法。
问题出在这里
我有一个PowerShell脚本,可以执行FTP传输到远程站点。它使用CuteFTP传输对象。该脚本由单行批处理文件调用。如果我从Windows命令提示符下运行该批处理文件,它将运行完美。但是,如果从Windows Task Scheduler调用了批处理文件,则PowerShell脚本在尝试创建CuteFTP对象时将失败。在这两种情况下,批处理文件都是使用本地服务器上的管理员帐户运行的。
事物的相关部分是:
批处理文件:
powershell.exe -File "D:\FTPToHost.ps1"
PowerShell脚本:
$oSite = New-Object -ComObject CuteFTPPro.TEConnection
$oSite.Protocol = 'FTP'
$oSite.Host = "99.999.9.999"
$oSite.Login = 'UserID'
$oSite.Password = 'MyPassword'
Windows Task Scheduler通过以下命令运行它:
D:\FTPToHost.cmd
批处理文件的执行在任务计划程序中起作用,但是PowerShell脚本因错误而失败:
New-Object : Retrieving the COM class factory for component with CLSID {112EA537-7AB9-4E22-8BFB-7FD5FCB19849} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)). At D:\FTPToHost.ps1:6 char:10 + $oSite = New-Object -ComObject CuteFTPPro.TEConnection + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ResourceUnavailable: (:) [New-Object], COMException + FullyQualifiedErrorId : NoCOMClassIdentified,Microsoft.PowerShell.Commands.NewObjectCommand
据我所知,问题似乎是由于任务计划程序正在运行PowerShell时未能建立正确的系统环境而导致,因此未正确找到或实例化ComObject。如前所述,如果仅打开命令提示符并从命令行运行.CMD文件,一切都会按预期进行。
系统环境为Windows Server2016。任何想法都将不胜感激。
范本
答案 0 :(得分:0)
我是PowerShell的新手,我遇到了具有不同应用程序的类似情况,与计划任务相似的条件以及相同的错误消息。就我而言,该应用程序的实例化
$ oSite =新对象-ComObject Application.Application
实际上启动了它,但是PowerShell对象没有绑定到它(我仍然不知道为什么)。
我最终要做的是:
我最终使用的代码如下:
$Proc = Get-Process process-name
if (-Not($Proc -eq $Null)) {
$NewApplicationObject = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Application.Application")
$NewApplicationObject.Property = value
$NewApplicationObject.Quit()
$oSite = $null
}
我想可以使用GetActiveObject cmdlet(或其他任何方法)将原始对象绑定回去,但我没有尝试过。
我希望这对您或任何阅读本文的人都有用。