A question came up about piping between advanced functions. The input to the second function might be an array. To illustrate how this works imagine a function that gets disk information – or better still use this one.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span style="color:#00008b;">function</span> <span style="color:#8a2be2;">get-mydisk</span><span style="color:#000000;">{</span> <span style="color:#a9a9a9;">[</span><span style="color:#00bfff;">CmdletBinding</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">]</span> <span style="color:#00008b;">param</span> <span style="color:#000000;">(</span> <span style="color:#008080;">[string]</span><span style="color:#ff4500;">$computername</span><span style="color:#a9a9a9;">=</span><span style="color:#8b0000;">"$env:COMPUTERNAME"</span> <span style="color:#000000;">)</span> <span style="color:#00008b;">BEGIN</span><span style="color:#000000;">{</span><span style="color:#000000;">}</span><span style="color:#006400;">#begin </span> <span style="color:#00008b;">PROCESS</span><span style="color:#000000;">{</span> <span style="color:#0000ff;">Get-WmiObject</span> <span style="color:#000080;">-Class</span> <span style="color:#8a2be2;">Win32_LogicalDisk</span> <span style="color:#000080;">-ComputerName</span> <span style="color:#ff4500;">$computername</span> <span style="color:#a9a9a9;">|</span> <span style="color:#0000ff;">foreach</span> <span style="color:#000000;">{</span> <span style="color:#0000ff;">New-Object</span> <span style="color:#000080;">-TypeName</span> <span style="color:#8a2be2;">PSObject</span> <span style="color:#000080;">-Property</span> <span style="color:#000000;">@{</span> <span style="color:#000000;">Disk</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$_</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">DeviceID</span> <span style="color:#000000;">Free</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$_</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">FreeSpace</span> <span style="color:#000000;">Size</span> <span style="color:#a9a9a9;">=</span> <span style="color:#ff4500;">$_</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Size</span> <span style="color:#000000;">}</span> <span style="color:#000000;">}</span> <span style="color:#000000;">}</span><span style="color:#006400;">#process </span> <span style="color:#00008b;">END</span><span style="color:#000000;">{</span><span style="color:#000000;">}</span><span style="color:#006400;">#end</span> <span style="color:#000000;">}</span> |
Use a computername as a parameter. Use WMI to get the disk information and output an object.
PS> get-mydisk | ft -AutoSize
Disk Free Size
—- —- —-
C: 149778239488 249951154176
D: 69271552 104853504
E:
F:
This works as well
PS> get-mydisk | where Size -gt 0 | ft -AutoSize
Disk Free Size
—- —- —-
C: 149778108416 249951154176
D: 69271552 104853504
You now have a function outputs objects that behave properly on the pipeline.
So now you want those objects piped into another function or you want an array of objects used as the input
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<span style="color:#00008b;">function</span> <span style="color:#8a2be2;">get-freeperc</span> <span style="color:#000000;">{</span> <span style="color:#a9a9a9;">[</span><span style="color:#00bfff;">CmdletBinding</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">]</span> <span style="color:#00008b;">param</span> <span style="color:#000000;">(</span> <span style="color:#a9a9a9;">[</span><span style="color:#00bfff;">parameter</span><span style="color:#000000;">(</span><span style="color:#000000;">ValueFromPipeline</span><span style="color:#a9a9a9;">=</span><span style="color:#ff4500;">$true</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">]</span> <span style="color:#008080;">[Object[]]</span><span style="color:#ff4500;">$disklist</span> <span style="color:#000000;">)</span> <span style="color:#00008b;">BEGIN</span><span style="color:#000000;">{</span><span style="color:#000000;">}</span><span style="color:#006400;">#begin </span> <span style="color:#00008b;">PROCESS</span><span style="color:#000000;">{</span> <span style="color:#00008b;">foreach</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$disk</span> <span style="color:#00008b;">in</span> <span style="color:#ff4500;">$disklist</span><span style="color:#000000;">)</span><span style="color:#000000;">{</span> <span style="color:#00008b;">if</span> <span style="color:#000000;">(</span><span style="color:#ff4500;">$disk</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Size</span> <span style="color:#a9a9a9;">-gt</span> <span style="color:#800080;">0</span><span style="color:#000000;">)</span><span style="color:#000000;">{</span> <span style="color:#ff4500;">$disk</span> <span style="color:#a9a9a9;">|</span> <span style="color:#0000ff;">Select</span> <span style="color:#8a2be2;">Disk</span><span style="color:#a9a9a9;">,</span> <span style="color:#000000;">@{</span><span style="color:#000000;">N</span><span style="color:#a9a9a9;">=</span><span style="color:#8b0000;">"Size(GB)"</span><span style="color:#000000;">;</span> <span style="color:#000000;">E</span><span style="color:#a9a9a9;">=</span><span style="color:#000000;">{</span><span style="color:#008080;">[math]</span><span style="color:#a9a9a9;">::</span><span style="color:#000000;">Round</span><span style="color:#000000;">(</span> <span style="color:#000000;">(</span><span style="color:#000000;">$(</span><span style="color:#ff4500;">$_</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Size</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">/</span><span style="color:#800080;">1GB</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">,</span> <span style="color:#800080;">2</span> <span style="color:#000000;">)</span><span style="color:#000000;">}</span><span style="color:#000000;">}</span><span style="color:#a9a9a9;">,</span> <span style="color:#000000;">@{</span><span style="color:#000000;">N</span><span style="color:#a9a9a9;">=</span><span style="color:#8b0000;">"FreePerc"</span><span style="color:#000000;">;</span> <span style="color:#000000;">E</span><span style="color:#a9a9a9;">=</span><span style="color:#000000;">{</span><span style="color:#008080;">[math]</span><span style="color:#a9a9a9;">::</span><span style="color:#000000;">Round</span><span style="color:#000000;">(</span> <span style="color:#000000;">(</span><span style="color:#000000;">$(</span><span style="color:#ff4500;">$_</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Free</span><span style="color:#000000;">)</span> <span style="color:#a9a9a9;">/</span> <span style="color:#000000;">$(</span><span style="color:#ff4500;">$_</span><span style="color:#a9a9a9;">.</span><span style="color:#000000;">Size</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span><span style="color:#a9a9a9;">*</span><span style="color:#800080;">100</span><span style="color:#a9a9a9;">,</span> <span style="color:#800080;">2</span> <span style="color:#000000;">)</span><span style="color:#000000;">}</span><span style="color:#000000;">}</span> <span style="color:#000000;">}</span> <span style="color:#000000;">}</span> <span style="color:#000000;">}</span><span style="color:#006400;">#process </span> <span style="color:#00008b;">END</span><span style="color:#000000;">{</span><span style="color:#000000;">}</span><span style="color:#006400;">#end</span> <span style="color:#000000;">}</span> |
- Set the parameter to accept pipeline input
- Set the parameter to accept an array of objects
- Use a process block
- Use a foreach block in the process block
This works
PS> get-mydisk | get-freeperc | ft -AutoSize
Disk Size(GB) FreePerc
—- ——– ——–
C: 232.79 59.92
D: 0.1 66.07
or this
$disks = get-mydisk
get-freeperc -disklist $disks
or this
get-freeperc -disklist (get-mydisk)