2

2,000 個の XML ファイルを解析してデータを取得し、それを Excel ファイルに出力するスクリプトを作成しています。これが私がこれまでに持っているものです:

#Get XML File
$path = Get-ChildItem C:\Users\bcamareno\Desktop\xml\xml

#Start Excel
$xl=New-Object -ComObject "Excel.Application"
$wb=$xl.Workbooks.Add()
$ws=$wb.ActiveSheet

$cells=$ws.Cells
$cells.item(1,1)="HDD Report"
$cells.item(1,1).font.bold=$True
$cells.item(1,1).font.size=18

#Rows & Cols
$row=3
$col=1
$A=4
$B=4
$C=4
$D=1
$E=2
$F=3

#column headings
"Server","Disk0","Disk1","Disk2","Disk3","Disk4","Disk5","Disk6","Disk7" | foreach {
    $cells.item($row,$col)=$_
    $cells.item($row,$col).font.bold=$True
    $col++
}

#Site Code
foreach ($item in $Path) {
$cells.item($A,$D)= $item -replace "_pdisk.xml",""
      $A++
}

#Grab ProductID
foreach ($item in $Path) {
    [xml]$content = Get-Content "c:\Users\bcamareno\Desktop\xml\xml\$item"
    $try= $Content.SelectNodes('//ProductID') | select "#Text"
    $cells.item($B,$E)= $try -replace "@{#text=","" -replace "}",""
    $B,$E++
}

$xl.Visible=$True

しかし、それを実行すると、データが間違っているように見えます.最後のファイルを解析してから、その結果をセルに追加しているようです.

必要に応じて XML を追加できます。

4

2 に答える 2

0

この記事を読むのが少し遅れたと思いますが、いくつかのテストを行ったところ、うまくいきました。

#Grab ProductID
foreach ($item in $path) {
    [xml]$content = Get-Content "c:\Users\bcamareno\Desktop\xml\xml\$item"
    foreach ($try in  $($Content.SelectNodes('//ProductID') | select "#Text")) {
    $cells.item($B,$E)= $try -replace "@{Size=","" -replace "}",""
    $B,$E++
    }
    $B++ 
    $E=2
}

私の疑似英語に感謝し、申し訳ありません:P

于 2015-09-24T14:35:27.270 に答える
0

$B増分されることはないため、スプレッドシートに行を追加することはありません。同じ行を 2000 回上書きするだけです。

また、1 文字よりもわかりやすい変数名を使用することをお勧めします。

また、次の行を変更します。

[xml]$content = Get-Content "c:\Users\bcamareno\Desktop\xml\xml\$item"

これに:

[xml]$content = Get-Content $item.FullName

そうすれば、XML ファイルの場所を変更するときに、一度だけ ( を呼び出したときGet-ChildItem) 変更するだけで済み、そのパスのすべてのインスタンスを更新するのを忘れたために 2 時間「バグ」を追跡する必要がなくなります。

于 2012-11-26T15:44:36.560 に答える