Powershell错误:值不在预期范围内.GetCollection(“组件”,[应用程序密钥]

时间:2017-05-03 23:02:43

标签: powershell com+

我可以成功运行下面的代码,在服务器Powershell ISE中逐行粘贴。

但是当我运行.ps1脚本时,我得到了一堆错误,我认为第一个是重要错误:“值不在预期范围内。”当我尝试使用应用程序的组件$compColl = $appsColl.GetCollection("Components", $app.Key)

填充变量时会发生这种情况

这是我的代码在脚本内部时不起作用。移动和重命名文件之前有更多的代码,一切正常。

$comAdmin = New-Object -comobject COMAdmin.COMAdminCatalog

$appsColl = $comAdmin.GetCollection("Applications")

$appsColl.Populate()


$targetApp = "pkgAdap2"
$app = $appsColl | Where-Object {$_.Name -eq  $targetApp}

*****************************************************************
 $compColl = $appsColl.GetCollection("Components", $app.Key)
*****************************************************************
$compColl.Populate()


$app.Value("IsEnabled") = $false
$comAdmin.ShutdownApplication($targetApp)


for ($i = $compColl.Count - 1; $i -ge 0; --$i)
{
  $compColl.Remove($i)
}

$compColl.SaveChanges()

以下是在Powershell ISE中逐行使用相同代码的成功尝试。没有错误,成功完成任务:

PS C:\Users\jdavis_admin> $app = $appsColl | Where-Object {$_.Name -eq  $targetApp}

PS C:\Users\jdavis_admin> $compColl = $appsColl.GetCollection("Components", $app.Key)

PS C:\Users\jdavis_admin> $compColl.Populate()

PS C:\Users\jdavis_admin> $app.Value("IsEnabled") = $false

PS C:\Users\jdavis_admin> $comAdmin.ShutdownApplication($targetApp)

PS C:\Users\jdavis_admin> for ($i = $compColl.Count - 1; $i -ge 0; --$i)
{
  $compColl.Remove($i)
}

我无法使任何睡眠循环工作,它似乎在脚本中的.GetCollection行上出错,但在逐行运行时则不然。所以我在.GetCollection之后立即设置了一个断点,以确保足够的,这是违规行。我不知道发生了什么或如何破解这些以删除组件。

#Get application to futz with:
$targetApp = "pkgAdap2"
$app = $appsColl | Where-Object {$_.Name -eq  $targetApp}

#GET Components in pkgAdap2
$compColl = $appsColl.GetCollection("Components",$app.Key)

Read-Host -Prompt "This is temporary stop and exit to see if .GetCollections finishes"

Error display for .GetCollection line

1 个答案:

答案 0 :(得分:0)

好的,我已经意识到在创建远程会话后我的.ps1脚本没有在远程服务器上运行。该脚本创建远程会话,但后续命令发生在启动脚本的客户端PowerShell ISE上。它在客户端上运行,因此无法按名称实例化COM对象,因为它不存在。因此“价值不在预期范围内”。

命令在远程服务器上的PowerShell ISE中工作。 命令在客户端,在客户端Powershell ISE中逐行工作,因为远程会话在命令启动后适用于命令。

但是,客户端上启动远程会话的脚本会立即恢复到客户端系统。

这样就回答了我开始这个帖子的问题。我将不得不为如何运行远程脚本或在远程会话中运行cmdlet创建另一个线程。

好的,所以我将脚本的COM +替换部分移动到驻留在服务器上的自己的脚本中。然后我就可以从我的第一个脚本(在客户端)上调用它。它现在适用于我想要的东西。

$s = New-PSSession -ComputerName "xxHSxxPLxx" -Credential $credential

Invoke-Command -Session $s -Command {D:\ServerDLLDev\RemoteCOMInstall.ps1}

我可以从客户端上的第一个脚本完成所有这些操作,但由于-Command语法中的嵌入式脚本,代码可能会引起注意。我希望我的麻烦帮助了别人。