Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the output of a powershell command into an array

I am trying to get the output of a powershell command into an array, but it seems not to work. In fact I want to address the output with a row and a column index. e.g.

$a=Get-Service

With output (part)

Status   Name               DisplayName                           
------   ----               -----------                           
Stopped  AeLookupSvc        Application Experience                
Stopped  ALG                Application Layer Gateway Service     
Stopped  AppIDSvc           Application Identity                  
Running  Appinfo            Application Information               
Stopped  AppMgmt            Application Management    

I want to address for the second line the DisplayName, e.g.

$a[2][2]

And it should give then

Application Layer Gateway Service

But this does not seem to work.

Can anybody help?

like image 429
Raf van de Vreugde Avatar asked Jan 11 '17 12:01

Raf van de Vreugde


People also ask

How do I convert to array in PowerShell?

PowerShell Converts String to Array using ToCharArray() Using the ToCharArray() method of String object, you can convert the string to an array of characters. In the above PowerShell script, the $testString variable contains the string value. We have used ToCharaArray() string method to convert a string to an array.

How do you write the output of a PowerShell command to a File?

To send a PowerShell command's output to the Out-File cmdlet, use the pipeline. Alternatively, you can store data in a variable and use the InputObject parameter to pass data to the Out-File cmdlet. Out-File saves data to a file but it does not produce any output objects to the pipeline.

How do I get output in PowerShell?

The echo command is used to print the variables or strings on the console. The echo command has an alias named “Write-Output” in Windows PowerShell Scripting language. In PowerShell, you can use “echo” and “Write-Output,” which will provide the same output.

How does PowerShell store data in an array?

To create and initialize an array, assign multiple values to a variable. The values stored in the array are delimited with a comma and separated from the variable name by the assignment operator ( = ). The comma can also be used to initialize a single item array by placing the comma before the single item.


3 Answers

This type of question makes me think that you're probably coming from a Unix background, and are accustomed to having to deal with indicies and column index, that sort of thing.

Fundamentally, PowerShell is an object-oriented scripting language. You simply don't need to do what you're asking about here.

For instance, if you want to capture the results, then grab a property for one of the objects, here's how that's done.

First, capture the output.

$a=Get-Service

Now, you want a particular property of a particular entity. To get that, index into the object you want.

>$a[2]
Status   Name               DisplayName                           
------   ----               -----------                           
Stopped  AJRouter           AllJoyn Router Service                

To select the .DisplayName, all you have to do is append that to the end of your previous command.

> $a[2].DisplayName
AllJoyn Router Service

If you want to select multiple values, you could use this approach instead.

#Select multiple values from one entity
$a[2] | select DisplayName, Status

>DisplayName                        Status
-----------                        ------
Application Layer Gateway Service Stopped

#Select multiple values from each in the array
$a | select DisplayName, Status

>DisplayName                                               Status
-----------                                               ------
Adobe Acrobat Update Service                             Running
AllJoyn Router Service                                   Stopped
Application Layer Gateway Service                        Stopped
Application Identity                                     Stopped
like image 87
FoxDeploy Avatar answered Oct 09 '22 05:10

FoxDeploy


This is not possible without a mapping from property names to array indices. Note that what you see in the output is just a partial list of properties (defined in an XML file somewhere). So there isn't even an easy way to convert those to array indices.

However, I also don't quite understand your need here. You can get the second service with $a[1], as expected. And then you can get its DisplayName property value with $a[1].DisplayName. PowerShell uses objects throughout. There is simply no need to fall back to text parsing or cryptic column indices just to get your data. There's an easier way.

like image 22
Joey Avatar answered Oct 09 '22 06:10

Joey


The output from Get-Service that you see in the Console may look like an array (as it is formatted as a table when sent to the Console), but it is actually an 'System.ServiceProcess.ServiceController' object.

Rather than using row and column designations, you need to use the name of the property to retrieve it, so for your example:

$a[2].DisplayName will return Application Layer Gateway Service

like image 4
henrycarteruk Avatar answered Oct 09 '22 05:10

henrycarteruk