2

问候!

所以,我只是在进行一些 powershell 编程的日常工作,然后遇到了这个小家伙:

Get-WmiObject : Invalid class 
At line:184 char:19
+ $RECApp = gwmi <<<<  Win32_product | ? {$_.Name.Contains($Application)}
+ CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], ManagementException
+ FullyQualifiedErrorId: GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

有趣的是,此错误仅在从脚本执行代码时显示,但当手动输入命令行时,相同的代码可以工作。我不知道这是否与我正在执行脚本的远程计算机有关,但是为什么要这样做,如果手动输入时它可以工作,但从脚本执行时却不能。我会在这里给你一段我的代码:

Enter-PSSession -ComputerName $serverName
$App = gwmi Win32_product | ? {$_.Name.Contains($Application)}
$App.Uninstall();
exit

总而言之,为什么当手动输入到命令行时,这段代码会像魅力一样工作,但是当从脚本执行时,我会得到上述错误?

谢谢。

4

1 回答 1

4

Enter-PSSession仅供交互使用。如果将该行放在脚本中,则后续行不会在远程会话中运行。如果你想在一个脚本中远程运行一些脚本,你可以这样做:

$session = New-PSSession -ComputerName $serverName
Invoke-Command -Session $session {
    param($name)

    $App = gwmi Win32_product | ? {$_.Name.Contains($name)}
    $App.Uninstall();
} -arguments $application

那里有一点问题,因为我必须将$application其作为参数传递给,Invoke-Command因为远程会话中不存在该变量。退后一步,您可以将上面的代码写得更简单一些,如下所示:

$app = gwmi -computer $servername win32_product | ? {
      $_.name.contains($application)
}

现在,问题在于您win32_product要从服务器拉回所有对象并在本地计算机上进行过滤。这是很多不必要的网络流量。如果你可以在远程机器上过滤会更快,所以让我们再修改一下:

$app = gwmi -computer $servername -query `
    "select * from win32_product where name = '$application'"
$app.Uninstall()

Now only the win32_product you want will be retrieved from the remote machine. I haven't tested the above gwmi -computer variants, so it's more illustrative of technique and syntax. You may have to play a bit with it.

于 2012-05-16T15:00:46.837 回答