使用测试路径查询多个文件版本

时间:2018-11-23 20:32:00

标签: powershell

我希望它使用多主机文本文件查询几个文件的版本,然后输出到CSV。如果我仅在$filename变量中输入一个$filepath变量,那么它将起作用。只是不能放$filename$filename1$filename2

$filename = "\Windows\System32\browser.dll"
$filename1 = "\Program Files\Logitech\SetPointP\setpoint.exe"
$filename2 = "\Program Files\MAGIX\Photostory Deluxe\2018\Fotos_dlx.exe"

$obj = New-Object System.Collections.ArrayList 

$computernames = Get-Content C:\Temp\computers.txt 
foreach ($computer in $computernames) 
{ 
$filepath = Test-Path "\\$computer\c$\$filename,$filename1,$filename2" 

if ($filepath -eq "True") { 
$file = Get-Item "\\$computer\c$\$filename" 


        $obj += New-Object psObject -Property @{'Computer'=$computer;'FileVersion'=$file.VersionInfo|Select FileVersion} 
        } 
     } 

$obj | select computer, FileVersion | Export-Csv -Path 'c:\Temp\File_Results.csv' -NoTypeInformation

3 个答案:

答案 0 :(得分:2)

Test-Path将接受要测试的文件数组,但是您没有正确构建该数组。首先将所有要测试的文件路径放入数组中

$filename = "\Windows\System32\browser.dll"
$filename1 = "\Program Files\Logitech\SetPointP\setpoint.exe"
$filename2 = "\Program Files\MAGIX\Photostory Deluxe\2018\Fotos_dlx.exe"
$filesToTest = @($filename, $filename1, $filename2)

然后,您可以测试每个:

$filesExist = $filesToTest | foreach {Test-Path "\\$computer\c$\$_"}

$filesExist包含一个布尔数组,因此您可以检查以确保它们都是真实的:

if($filesExist -notcontains $false)
     #get the file info

答案 1 :(得分:0)

您需要一个ForEach来处理文件数组,
但是您可以通过叠加当前的Test-Path来保持布尔值最终结果:

## Q:\Test\2018\11\23\SO_53452648.ps1
$filename = "\Windows\System32\browser.dll"
$filename1 = "\Program Files\Logitech\SetPointP\setpoint.exe"
$filename2 = "\Program Files\MAGIX\Photostory Deluxe\2018\Fotos_dlx.exe"
$filesToTest = @($filename, $filename1, $filename2)

Clear-Variable filesExist -ErrorAction SilentlyContinue
$Computer = $ENV:COMPUTERNAME

$filesToTest | ForEach-Object {
    "{0,5} Test-Path {1}" -f (Test-Path "\\$computer\c$\$_"),"\\$computer\c$\$_"
    $filesexist = $filesexist -and (Test-Path "\\$computer\c$\$_")
}
"="*40
"{0,5} filesexist on {1}" -f $filesexist,$computer

样本输出。

> Q:\Test\2018\11\23\SO_53452648.ps1
 True Test-Path \\HP-G1610\c$\\Windows\System32\browser.dll
 True Test-Path \\HP-G1610\c$\\Program Files\Logitech\SetPointP\setpoint.exe
False Test-Path \\HP-G1610\c$\\Program Files\MAGIX\Photostory Deluxe\2018\Fotos_dlx.exe
========================================
False filesexist on HP-G1610

答案 2 :(得分:0)

更简单些吗?

$found = true ; $filepath = Test-Path "\\$computer\c$\$filename", "$filename1" , "$filename2" | % {$found = $found -and $_ }

Test-Path确实接受文件名数组,您可以像在示例中一开始那样输入。这是一个单行示例,一些纯粹主义者可能建议使用ForEach-Object代替%

或者,您可以使用@zdan建议的-notContains语法进行简化。