2016-09-26 9 views
0

foreachループで$ serverNameの値を持つ「サーバー名」のインクルードスクリプトで作成している.csvファイルの先頭に列を追加したいとします。CSVの先頭に列を追加

このようにして、CSVは各行の先頭にサーバー名を含む「サーバー名」を含め、xmlファイルから取得する情報を表示します。

これにはどのような方法が最適ですか?ありがとう!

$localPath = "C:\Temp\MPOS" 

$serverList = (Get-ADComputer -Filter "Name -like 'Q0*00*'" -SearchBase "OU=MPOS,OU=Prod,OU=POS,DC=company,DC=NET").name | Sort-Object | Out-File C:\Temp\MPOS\MPOSServers.txt 

$serverNames = Get-Content $serverList 

foreach ($serverName in $serverNames) { 

    Add-Content $logfile "Processing $serverName" 

    $serverCsv = $serverNames | 

     #Check if the server is online before doing the remote command 
     If (Test-Connection -ComputerName $serverName -Quiet -count 1) { 

      #copy config file from MPOS print to local server for processing 
      $configPath = "\\$($serverName)\D$\mposdevices\deviceconfig.xml" 
      Copy-Item $configPath $localPath 

      #process xml file to output data to csv file 
      $xml = Get-Content C:\Temp\MPOS\DeviceConfig.xml 
      $xmldata = [xml]$xml 
      $xmldata.DeviceConfig.ChildNodes | Export-Csv -Path C:\Temp\MPOS\MDATInfo.csv -NoTypeInformation -Append 

     } #If (Test-Connection -ComputerName $serverName -Quiet -count 1) { 

} #foreach ($serverName in $serverNames) { 

答えて

1

以下の修正されたスクリプトを試してください。私は$serverCsv = $serverNames |行を削除しました。パイプが何かにパイプしているように見えなかったからです。

あなたのcsvリストとエクスポートの間に| Select @{Name="ServerName"; Expression={ $serverName }}, *を追加しました。これにより、現在の$serverNameをループから保持する新しいServerName変数が導入されます。 *は、あなたのcsvリストの残りのフィールドを使用します。

$localPath = "C:\Temp\MPOS" 

$serverList = (Get-ADComputer -Filter "Name -like 'Q0*00*'" -SearchBase "OU=MPOS,OU=Prod,OU=POS,DC=company,DC=NET").name | Sort-Object | Out-File C:\Temp\MPOS\MPOSServers.txt 

$serverNames = Get-Content $serverList 

foreach ($serverName in $serverNames) { 

    Add-Content $logfile "Processing $serverName" 

     #Check if the server is online before doing the remote command 
     If (Test-Connection -ComputerName $serverName -Quiet -count 1) { 

      #copy config file from MPOS print to local server for processing 
      $configPath = "\\$($serverName)\D$\mposdevices\deviceconfig.xml" 
      Copy-Item $configPath $localPath 

      #process xml file to output data to csv file 
      $xml = Get-Content C:\Temp\MPOS\DeviceConfig.xml 
      $xmldata = [xml]$xml 
      $xmldata.DeviceConfig.ChildNodes | Select @{Name="ServerName"; Expression={ $serverName }}, * | Export-Csv -Path C:\Temp\MPOS\MDATInfo.csv -NoTypeInformation -Append 

     } #If (Test-Connection -ComputerName $serverName -Quiet -count 1) { 

} #foreach ($serverName in $serverNames) { 
+0

を理解することができ、そのオブジェクトの一種である、PSObjectを生成します。 ServerName列はどうすればよいのですか?迅速な対応をありがとう! – LilithGoddess

+0

それはそれを引き起こす '*'でしょう。 '$ xmldata.DeviceConfig.ChildNodes'に何が入っているのか分かりません。 '*'の代わりに、特定の列を追加してください。 – TechSpud

+0

Nevermind - 考え出しました! :)ありがとう – LilithGoddess

0

これを行う別の方法は、パイプライン内にとどまることです。あなたが何をしたいか

  • は、出力オブジェクト(名前と値)を生成、ADそれらのそれぞれのため
  • ソートそれら
  • でコンピュータを検索
  • CSV
  • にそれらをエクスポート

これは次のようになります。

Push-Location "C:\Temp\MPOS" 

Get-ADComputer -Filter "Name -like 'Q0*00*'" | Sort-Object Name | ForEach-Object { 
    $serverName = $_.Name 
    Add-Content MDATInfo.log "Processing $serverName" 
    Write-Host "Processing $serverName" 

    $line = @{ 
     serverName = $_.Name 
     foo = "" 
     bar = "" 
     baz = "" 
    } 

    if (Test-Connection -ComputerName $_.Name -Quiet -Count 1) { 
     $deviceConfigXml = [xml](Get-Content "\\$serverName\D$\mposdevices\deviceconfig.xml") 
     $deviceConfig = $DeviceConfigXml.DeviceConfig 
     $line.foo = $deviceConfig.foo 
     $line.bar = $deviceConfig.bar 
     $line.baz = $deviceConfig.baz 
    } 

    New-Object –TypeName PSObject –Prop $line 
} | Export-Csv MDATInfo.csv -NoTypeInformation 

Pop-Location 

注:

  • Push-LocationPop-Locationスクリプト
  • ファイルにサーバー名を記述する必要はありませんの残りの部分で相対パスで作業することができ、あなたは直接サーバーオブジェクトを操作することができます
  • XMLファイルをサーバーからコピーする必要はなく、リモートの場所から直接開くことができます
  • スクリプトは出力オブジェクトが常に均一であることを保証します - XMLコンテンツまたはserに関係なく同じ数のプロパティ利用可能性
  • For-Eachスクリプトブロックの最後の値は、出力パイプラインに配置されます。
  • キー行はNew-Object –TypeName PSObject –Prop $lineです。
    それはExport-Csvが.CSVの初めに要求された列を追加し、それはまた、最後に不要な列の束を追加し
関連する問題