繁体   English   中英

PowerShell代码可交互工作,但不能在脚本内工作

[英]PowerShell code works interactively, but not inside a script

敬礼!

因此,我只是在进行一些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

总而言之,为什么在手动输入到命令行时,此代码为何像超级按钮一样工作,但是从脚本执行时却出现上述错误?

谢谢。

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()

现在,仅需要的win32_product将从远程计算机中检索。 我尚未测试上述gwmi -computer变体,因此它更能说明技术和语法。 您可能需要尝试一下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM