【问题标题】:Add Column to Start of CSV将列添加到 CSV 的开头
【发布时间】:2016-09-26 16:27:35
【问题描述】:

我想在包含的脚本中创建的 .csv 文件的开头添加一列,用于在 foreach 循环中具有 $serverName 值的“服务器名称”。

这样,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) {

【问题讨论】:

    标签: xml powershell csv


    【解决方案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) {
    

    【讨论】:

    • 这确实在 .csv 的开头添加了请求的列,但它还在末尾添加了一堆不必要的列。我怎样才能只有 ServerName 列?感谢您的快速回复!
    • * 造成的。我不确定$xmldata.DeviceConfig.ChildNodes 中有什么。而不是*,添加特定的列
    • 酷。没问题:)
    【解决方案2】:

    另一种方法是留在管道内。

    你想做什么:

    • 在 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 内容或服务器可用性如何,属性数量都相同
    • For-Each 脚本块中的最后一个值被放置到输出管道中
    • 关键行是New-Object –TypeName PSObject –Prop $line
      它产生一个PSObject,这是Export-Csv可以理解的那种对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      相关资源
      最近更新 更多