Export-csv formatting. Powershell

2019-09-09 21:38发布

问题:

Let's start off by saying that I'm quite new to Powershell and not the greatest one working with it's code and scripts but trying to learn. And now to the problem!

I'm working on a script that fetches information from computers in the network. I've got some code that works quite well for my purposes. But I'm having some problem when it comes to some information, mostly information that contains multiple objects, like service.

#This application will pull information from a list of devices. The devices list is
sent with C:\Users\test.txt and output is pushed to a file C:\Users\devices.csv


function kopiera
{
param
(
    [Parameter(ValueFromPipeline=$true)]
    [string[]]$Computer=$env:computername
)    
Process
{
    $computer | ForEach-Object{

        $service=Get-WmiObject -Class Win32_Service -Computername $_


        $prop= [ordered]@{
                    Service =$service.caption 
                }
        New-Object PSCustomObject -Property   $prop
    }
}
}

Get-Content C:\Users\test.txt | kopiera | Export-csv c:\Users\devices.csv

When I export the csv file it looks like this:

TYPE System.Management.Automation.PSCustomObject

"Service"

"System.Object[]"

So it doesn't fetch the service.caption (Because there are too many?). But If I replace the export-csv C:\Users\device.csv with out-file C:\Users\devices.txt it looks like this instead:

{Adobe Acrobat Update Service, Adobe Flash Player Update Service, Andrea ADI Filters Service, Application Experience...}

So it's starting to look better, but it doesn't get them all (Still because there are too many services?). What I'd like to do with this export/out-file is to get the information to appear vertically instead of horizontal.

(Wanted result)

Adobe Acrobat Service

Adobe Flash Player Update Service

and so on..

instead of: (Actual result)

Adobe Acrobat Update Service, Adobe Flash Player Update Service, and so on...

Is there a way to make this possible, been trying for a while and can't wrap my brain around this.

Any help is appreciated!

回答1:

CSV is not usually a good choice for exporting objects that contain multi-valued or complex properties. The object properties are going to be converted to a single string value. The only way to store an array of values is to convert it to a delimited string.

$prop= [ordered]@{
                  Service =($service.caption) -join ';'
                 }

will create a semi-colon delimited string, and you'll have to deal with splitting it back out in whatever appication is using the csv later.

If you want to save and re-import the original object with the property as an array, you can switch to Export-CLIXML instead of Export-CSV.