Powershell错误:值不在预期范围内。GetCollection(“组件”和[Application Key]

Powershell错误:值不在预期范围内。GetCollection(“组件”和[Application Key],powershell,com+,Powershell,Com+,我可以成功地运行下面的代码,在服务器Powershell ISE中逐行粘贴 但是,当我运行.ps1脚本时,会出现一系列错误,我认为第一个错误很重要:“值不在预期范围内。”当我尝试用应用程序的组件填充变量时,会出现这种情况,compColl=$appsColl.GetCollection(“组件”,$app.Key) 这是我在脚本中无法使用的代码。在移动和重命名文件之前,还有更多的代码,所有这些都可以使用 $comAdmin = New-Object -comobject COMAdmin.COM

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

但是,当我运行.ps1脚本时,会出现一系列错误,我认为第一个错误很重要:“值不在预期范围内。”当我尝试用应用程序的组件填充变量时,会出现这种情况,
compColl=$appsColl.GetCollection(“组件”,$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"

好的,我意识到在创建远程会话后,我的.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语法中嵌入了脚本,代码会让人看不清。我希望我的麻烦能帮助其他人。

我猜
Populate()
方法在完成之前返回提示。您可能需要等待它完成类似以下操作:
Do{$LastCount=$appsColl.count;start sleep-sec 2}While($LastCount-ne$appsColl.count)
因此,在您告诉它填充后,它会检查其项目计数,等待2秒钟,如果计数发生变化,它会再次等待,直到2秒钟后计数相同(希望表明它已完成填充其集合).TheMadTechnician,你可能有一些东西,但我认为循环的语法不正确,因为现在脚本根本不运行,这通常是我添加新内容时会发生的情况。我将研究如何睡眠x数量,但同时,如果你的评论正确,也许你可以回答,然后我可以接受它作为答案。干杯。我添加了Start Sleep-s 100,但它仍然有“值不在预期范围内”的错误他们等待了100秒,所有其他错误都出现了。我可以成功地在服务器上运行代码,我可以从工作站中执行远程会话,并逐行运行代码。您是否考虑过在本地运行该代码,而不是使用该方法来运行它?我无法计算如何使用C++ V。PowerShell中的版本…错误并不十分严重。什么“值”不在预期范围内?名称“组件”?$app.Key?应用程序中有91个组件。但是,它在PowerShell ISE中手动逐行工作。