2017-06-05 6 views
2

皆さん、のPowershell事前

私はいくつかの答えを見つけましたが、彼らは、マニュアルの配列のためにあるように見えるか、明確な番号を知っているとき。私はそこにどれくらいの人がいるのかわからない配列を持っています。私が助けを得ることができるかどうか疑問に思いました。

基本的には、各サーバーに行き、OCXとDLLの名前、バージョン、日付を取得してスプレッドシートに入れたいと思います。

一度しかうまくいかないようですね。それは私の配列の次のファイルに移動しません。

とても近いイム、誰かが私がそれを伝えることができます(すべてのファイルを取得して終了するまでOK、次のサーバに事前にいけない)

はここで、これまでに私のコードです。うまく動作しますが、サーバごとに1つのファイルに対してのみ有効です。

事前に感謝します。

$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++ 
    } 
} 

私はまた$Rowのように、より説明的なものに$xの名前を変更をお勧めします。

+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