【发布时间】:2018-01-04 18:51:55
【问题描述】:
我正在尝试运行将 CSV 信息导入 PowerShell 的脚本,以卸载远程计算机上的软件。 CSV 文件包含主机名、IP 地址和已安装应用程序名称等信息。 CSV 文件如下所示(抱歉输入错误):
名称、序列号、IP 地址、MAC 地址、已安装的应用程序 计算机1,ABC123,1.1.1.1,12:34:45:67:89,Adobe Air基本上,这个想法是在“名称”(计算机主机名)上卸载“已安装的应用程序”(本例为 Adobe Air)。
PowerShell 脚本:
$csv = Import-Csv C:\path\report.csv
$DisplayName = $csv."Installed Applications"
$path = Split-Path -Path $MyInvocation.MyCommand.Path
$computers = $csv.Name
foreach ($server in $computers) {
$app = Get-WmiObject -Class Win32_Product -ComputerName $server |
Where-Object {$_.DisplayName -match $csv."Installed Applications"}
$pathobj = New-Object -TypeName PSobject
$pathobj | Add-Member -MemberType NoteProperty -Name Computername -Value $server.ToUpper()
$pathobj | Add-Member -MemberType NoteProperty -Name Software -Value $csv."Installed Applications"
$var = ($app.Uninstall()).ReturnValue
if($var -eq 0) {
$pathobj | Add-Member -MemberType NoteProperty -Name Status -Value "Successfully Uninstalled"
$pathobj | Add-Member -MemberType NoteProperty -Name Date -Value $(Get-Date)
} else {
$pathobj | Add-Member -MemberType NoteProperty -Name Status -Value "Unable to uninstall"
$pathobj | Add-Member -MemberType NoteProperty -Name Date -Value $(Get-Date)
}
#Write-Output $pathobj | Export-Csv "$path\ObsoleteStatus.csv" -NoTypeInformation -Append
}
当我执行它时,它总是给我:
您不能在空值表达式上调用方法。 在 C:\Users\sbellec\Desktop\test5.ps1:18 char:28 + $var = ($app.Uninstall我尝试了不同的方法来修复它,但没有任何结果。关于我做错了什么有什么想法吗?
【问题讨论】:
-
不是答案,但仅供参考you shouldn't be using
Win32_Product。 -
看起来您没有返回任何与您的
$csv匹配的应用程序。所以$app是$null这意味着它没有卸载方法。您可以在$app上循环ForEach-Object,这将处理没有匹配项和多个匹配项。 -
请在调用
.Uninstall()之前打印出$app 变量。如果它不是您所期望的,请向上移动变量声明链并通过仅打印变量和操作结果来查看您做错了什么。我怀疑这条线是 BS:Where-Object {$_.DisplayName -match $csv."Installed Applications"} -
您发布的数据首先不是逗号分隔的,因此您的代码甚至不应该达到可能引发该错误的地步。请告诉我们minimal reproducible example 和错误 代码产生。
-
感谢所有评论。我会尝试建议并让您知道。 @Angar:CSV 格式是逗号分隔的,我不得不修改这条消息的格式。
标签: powershell csv