2017-06-05 43 views
2

伙计们,PowerShell的事先通过在foreach循环数组(或嵌套的foreach)

我发现了一些答案,但他们似乎是手工阵列,或当你知道确切数字。我会有一个数组,我不知道有多少人会在那里。想知道我能否得到帮助。

基本上 - 我希望它通过每个服务器,获取OCX和DLL的名称,版本和日期,并将其放入电子表格中。

它似乎工作正常......只有一次。它不会继续到我的数组中的下一个文件。

林如此接近,有人可以帮我告诉它(OK,不前进到下一个服务器,直到你完成让所有的文件)

这里是我到目前为止的代码。效果很好 - 但仅适用于每台服务器一个文件。

非常感谢提前。

$Servers = Get-Content C:\temp\Servers.txt 

$objExcel=New-Object -ComObject Excel.Application 
$objExcel.Visible=-1 
$WorkBook=$objExcel.WorkBooks.Add() 
$sheet=$workbook.worksheets.item(1) 
$class = "win32_Share" 

$sheet.Cells.item(1,1)=("Server") 
$sheet.Cells.item(1,2)=("File Name") 
$sheet.Cells.Item(1,3)=("File Version") 
$sheet.Cells.Item(1,4)=("Date") 
$sheet.Range("A1:D1").interior.colorindex = 43 
$x=2 


$i = 0 

foreach ($Server in $Servers) { 


    $infos = Invoke-Command -computername $Server {Get-ChildItem "V:\Service\*" -File -Include *.dll, *.ocx | Select-Object name,@{label="FileVersion";expression={$_.versioninfo.fileversion}},@{label="Date";expression={$_.LastWriteTime}}} 

    $info = $infos[$i] 



$sheet.Cells.item($x, 1)=($Server) 
$sheet.Cells.item($x, 2)=($info.name) 
$sheet.Cells.item($x, 3)=($info.FileVersion) 
$sheet.Cells.item($x, 4)=($info.Date) 
$x++ 
$i++ 
} 

#Autofit columns when completed 
$range = $sheet.usedRange 
$range.EntireColumn.Autofit() 

它似乎从来没有通过$ info [$ i]数组前进。

回答

4

只是窝另一个的foreach:

$x = 2 
foreach ($Server in $Servers) { 
    $infos = Invoke-Command -computername $Server { Get-ChildItem "V:\Service\*" -File -Include *.dll, *.ocx | Select-Object name,@{label="FileVersion";expression={$_.versioninfo.fileversion}},@{label="Date";expression={$_.LastWriteTime}}} 

    foreach ($info in $infos) { 
     $sheet.Cells.item($x, 1)=($Server) 
     $sheet.Cells.item($x, 2)=($info.name) 
     $sheet.Cells.item($x, 3)=($info.FileVersion) 
     $sheet.Cells.item($x, 4)=($info.Date) 
     $x++ 
    } 
} 

我还建议重新命名$x为更具描述性,像$Row

+0

非常感谢! – TelluRye

1

我建议一次获取所有信息,按服务器对其进行排序,选择需要的内容,将其转换为制表符分隔的csv,将其复制到剪贴板,然后将其粘贴到电子表格中。

$Servers = Get-Content C:\temp\Servers.txt 

$objExcel=New-Object -ComObject Excel.Application 
$objExcel.Visible=-1 
$WorkBook=$objExcel.WorkBooks.Add() 
$sheet=$workbook.worksheets.item(1) 
$class = "win32_Share" 
$infos = Invoke-Command -ComputerName $Servers -ScriptBlock { Get-ChildItem "V:\Service\*" -File -Include *.dll, *.ocx } 
$infos | 
    Sort PSComputerName | 
    Select-Object @{l='Name';e={$_.PSComputerName}},@{l='File Name';e={$_.Name}},@{label="File Version";expression={$_.versioninfo.fileversion}},@{label="Date";expression={$_.LastWriteTime}} | 
    ConvertTo-CSV -Del "`t" | 
    | Clip 
$sheet.cells.item(1,1).PasteSpecial() | Out-Null 

$sheet.Range("A1:D1").interior.colorindex = 43 
#Autofit columns when completed 
$range = $sheet.usedRange 
$range.EntireColumn.Autofit() 
+0

这真是太棒了!谢谢!! – TelluRye