我可以成功运行下面的代码,在服务器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"
答案 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语法中的嵌入式脚本,代码可能会引起注意。我希望我的麻烦帮助了别人。