Запрос нескольких версий файлов с использованием Test-Path - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу запросить версию нескольких файлов, используя текстовый файл с несколькими хостами, а затем вывести их в 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 голосов
/ 24 ноября 2018

Вам понадобится 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
0 голосов
/ 26 ноября 2018

Короче проще?

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

Test-Path принимает массив имен файлов, и вы можете ввести его так же, как вы начали в своем примере.Это пример из одной строки, и некоторые пуристы могут предложить использовать ForEach-Object вместо %.

В качестве альтернативы вы можете упростить использование синтаксиса -notContains, предложенного @ zdan.

0 голосов
/ 24 ноября 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...