2016-09-26 2 views
0

foreach 루프에서 $ serverName 값을 가진 "Server Names"에 대해 포함 된 스크립트에서 만들고있는 .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 목록과 내보내기간에을 추가했습니다. 루프에서 현재 $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에 관계없이 동일한 속성 수를 보장합니다. 가용성
  • VER For-Each 스크립트 블록의 마지막 값은 키 라인 New-Object –TypeName PSObject –Prop $line되는 출력 파이프
  • 상에 배치된다.
    그것은 Export-Csv은 .CSV의 시작 부분에 요청 된 열을 추가 않는