1

我正在尝试在多台服务器上使用 Powershell 远程获取 dll 的文件版本,并将服务器名称、dll 版本和 dll 文件位置写入 csv 或 html 报告。问题是一些服务器是 Win 2003 和 Win 2008。因此该文件可能驻留在例如 C:\Program Files\WinZip\WZCAB.DLL 或 C:\Program Files (x86)\WinZip\WZCAB.DLL 中。该脚本将检查一个位置,如果它不存在,它将检查另一个位置,然后将其写出。谁能帮我吗?

只是几件事 - 此脚本将用于访问 200 多台服务器或 VM 的 2003 和 2008。在 2003 上它需要 Powershell 2.0 和 2008 将及时启用远程处理。我在想也许我需要使用 WMI。我还有两个利用 WMI 获取补丁和重启时间的脚本。我确实尝试了 Ravikanth 脚本(再次感谢您)并在传递服务器的 txt 文件时收到以下错误 - 一个或多个计算机名称无效。如果您尝试传递 Uri,请使用 -ConnectionUri 参数或传递 Uri 对象而不是字符串。再次,因为我不会在每台服务器上启用远程处理,还有其他方法吗?我修改了 Ravikanth 脚本(如下)并在本地尝试过,效果很好。当我远程尝试时,它没有。有什么想法吗?

$servers = "D:\scripts\winzip\servers.txt" 
$x86Path = 'C:\Program Files (x86)\WinZip\WZCAB.DLL'
$x64Path = 'C:\Program Files\WinZip\WZCAB.DLL'

    foreach ($computername in $servers){
        if (Test-Path $x86Path) {
            (Get-Item $x86Path | Select -ExpandProperty VersionInfo).FileVersion
        } elseif (Test-Path $x64Path) {
            (Get-Item $x64Path | Select -ExpandProperty VersionInfo).FileVersion           
        }
    }
4

2 回答 2

5

如果您在这些计算机上启用了远程处理:

$servers = 'server1','server2'
$x86Path = 'C:\Program Files (x86)\WinZip\WZCAB.DLL'
$x64Path = 'C:\Program Files\WinZip\WZCAB.DLL'
Invoke-Command $servers {
    Param ($x86Path, $x64Path)
    if (Test-Path $x86Path) {
        (Get-Item $x86Path | Select -ExpandProperty VersionInfo).FileVersion
    } elseif (Test-Path $x64Path) {
        (Get-Item $x64Path | Select -ExpandProperty VersionInfo).FileVersion           
    }
} -ArgumentList $x86Path,$x64Path

这是 WMI 的做法:

$servers = @(Get-Content C:\servers.txt) 
$servers | % { Get-WMIObject -ComputerName $_ -Query "SELECT * FROM CIM_DataFile WHERE Drive ='C:' AND Path='\\Program Files (x86)\\WinZip\\' AND FileName='WZCAB' AND Extension='dll'" } | select Version

这只是您需要的一部分。您需要放置一个 try-catch 块以确保在该路径上找不到文件的情况下处理错误。我会把它留给你的研发。

于 2011-12-08T04:28:45.113 回答
0

使用Test-Pathcmdlet 查看路径是否存在。如果不使用备用路径。

并且 Program Files 路径的差异不是来自 Win 2003 或 2008,而是来自操作系统是 32 位还是 64 位以及应用程序支持 32 位还是 64 位。

于 2011-12-08T00:14:48.160 回答