Powershell Error: Value does not fall within expected range .GetCollection("Components", [Application Key]
Powershell Error: Value does not fall within expected range .GetCollection("Components", [Application Key]
我可以 运行 成功地在服务器 Powershell ISE 中逐行粘贴下面的代码。
但是当我 运行 一个 .ps1 脚本时,我得到了一堆错误,我认为第一个是重要的错误: "Value does not fall within expected range." 当我尝试填充时发生包含应用程序组件的变量,$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"
好的,在创建远程会话后,我意识到我的 .ps1 脚本没有 运行ning 在远程服务器上。该脚本创建远程会话,但后续命令发生在启动该脚本的客户端 PowerShell ISE 上。它 运行 在它所在的客户端上,因此无法按名称实例化 COM 对象,因为它不存在。因此 "Value does not fall within expected range".
命令在远程服务器上的 PowerShell ISE 中运行。
命令在客户端上运行,在客户端 Powershell ISE 中逐行运行,因为远程会话在启动后对命令起作用。
但是,客户端上启动远程会话的脚本会立即恢复到客户端系统。
这样就回答了我启动此线程的问题。我将不得不创建另一个线程来了解如何在远程会话中 运行 远程脚本或 运行 cmdlet。
好的,所以我将脚本的 COM+ 替换部分移到了驻留在服务器上的它自己的脚本中。然后我就可以从我的第一个脚本(在客户端)中调用它。它现在可以满足我的需求。
$s = New-PSSession -ComputerName "xxHSxxPLxx" -Credential $credential
Invoke-Command -Session $s -Command {D:\ServerDLLDev\RemoteCOMInstall.ps1}
我本可以从客户端的第一个脚本中完成所有这些操作,但由于 -Command 语法中嵌入了脚本,所以代码会很碍眼。希望我的烦恼对别人有帮助。
我可以 运行 成功地在服务器 Powershell ISE 中逐行粘贴下面的代码。
但是当我 运行 一个 .ps1 脚本时,我得到了一堆错误,我认为第一个是重要的错误: "Value does not fall within expected range." 当我尝试填充时发生包含应用程序组件的变量,$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"
好的,在创建远程会话后,我意识到我的 .ps1 脚本没有 运行ning 在远程服务器上。该脚本创建远程会话,但后续命令发生在启动该脚本的客户端 PowerShell ISE 上。它 运行 在它所在的客户端上,因此无法按名称实例化 COM 对象,因为它不存在。因此 "Value does not fall within expected range".
命令在远程服务器上的 PowerShell ISE 中运行。 命令在客户端上运行,在客户端 Powershell ISE 中逐行运行,因为远程会话在启动后对命令起作用。
但是,客户端上启动远程会话的脚本会立即恢复到客户端系统。
这样就回答了我启动此线程的问题。我将不得不创建另一个线程来了解如何在远程会话中 运行 远程脚本或 运行 cmdlet。
好的,所以我将脚本的 COM+ 替换部分移到了驻留在服务器上的它自己的脚本中。然后我就可以从我的第一个脚本(在客户端)中调用它。它现在可以满足我的需求。
$s = New-PSSession -ComputerName "xxHSxxPLxx" -Credential $credential
Invoke-Command -Session $s -Command {D:\ServerDLLDev\RemoteCOMInstall.ps1}
我本可以从客户端的第一个脚本中完成所有这些操作,但由于 -Command 语法中嵌入了脚本,所以代码会很碍眼。希望我的烦恼对别人有帮助。