我正在尝试找出我的网络上谁安装了 Access。我在使列表正常工作时遇到了几个问题,因此我使用了输出 txt 文件。无论如何,即使这不是一个好方法,它仍然应该有效。有人能告诉我为什么这不起作用吗?
$Computers = Get-QADComputer | select name | Out-File "c:\access_search.txt"
$Computers = Get-Content "c:\access_search.txt"
$Path = "\c$\Program Files\Microsoft Office\Office12\Access.pip"
$AccessPath = "\\" + $PCName + $Path
Foreach ($PCname in $Computers){
$Result = Test-Path $AccessPath
if ($Result -eq "True")
{$Pcname}
}
答案1
您没有测试正确的路径,因为它是在foreach
定义循环之前分配的。这意味着您每次都$PCname
在测试路径。\\\c$\Program Files\Microsoft Office\Office12\Access.pip
尝试这个:
$Computers = Get-QADComputer | select name | Out-File "c:\access_search.txt"
$Computers = Get-Content "c:\access_search.txt"
$Path = "\c$\Program Files\Microsoft Office\Office12\Access.pip"
Foreach ($PCname in $Computers){
$AccessPath = "\\" + $PCName + $Path
$Result = Test-Path $AccessPath
if ($Result -eq "True")
{$Pcname}
}
答案2
虽然检查特定文件的方法在某些情况下可能有效,但它不能解释文件存在但未安装的情况;或者 Access 安装在不同的位置。
为了避免这两种情况,可以使用 WMI(包括远程)直接读取 MSI 数据。
gwmi -comp ComputerNameGoesHere WIn32_SoftwareFeature -filter "name like 'access%' and productname like 'microsoft%'" |
fl Name,ProductName,Version,Vendor
在两台装有 Access(2010,一个是 x86,一个是 x64,作为 Office Professional Plus 的一部分)的计算机上都返回了多个结果,而在未安装 Office 的系统上没有结果。过滤规则可能需要针对独立 Access 安装或早期版本进行调整。