我希望它使用多主机文本文件查询几个文件的版本,然后输出到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
答案 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
语法进行简化。