gpt4 book ai didi

PowerShell 代码以交互方式工作,但不在脚本内

转载 作者:行者123 更新时间:2023-12-02 23:15:41 25 4
gpt4 key购买 nike

问候!

所以,我只是在进行一些 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 中运行。如果你想在一个脚本中远程运行一些脚本,你可以这样做:

$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 的参数因为该变量在远程 session 中不存在。退后一步,您可以将上面的代码写得更简单一些,如下所示:
$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我没有测试过变体,所以它更能说明技术和语法。你可能需要玩一下它。

关于PowerShell 代码以交互方式工作,但不在脚本内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10621182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com