Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PowerShell's Write-Debug won't output arrays, but Write-Output does. Is this on purpose?

Tags:

powershell

Shown below, an array works fine as input for Write-Output but not for Write-Debug (I expected them to be more similar than that).

PS C:\> [string[]]$test = @("test1", "test2", "test3")
PS C:\> Write-Output $test
test1
test2
test3
PS C:\> $DebugPreference = "Inquire"
PS C:\> Write-Debug $test
Write-Debug : Cannot convert 'System.String[]' to the type 'System.String' required by parameter 'Message'. Specified method is not supported.
At line:1 char:12
+ Write-Debug <<<<  $test
    + CategoryInfo          : InvalidArgument: (:) [Write-Debug], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.WriteDebugCommand

PS C:\>

I'm thinking this is just an unfortunate design, but hoping for a sensible explanation. Am I using Write-Debug correctly? If so, anyone have a favorite simple workaround?

like image 676
Vimes Avatar asked Jul 05 '11 23:07

Vimes


People also ask

What is the difference between Write-host and Write-output in PowerShell?

In a nutshell, Write-Host writes to the console itself. Think of it as a MsgBox in VBScript. Write-Output , on the other hand, writes to the pipeline, so the next command can accept it as its input. You are not required to use Write-Output in order to write objects, as Write-Output is implicitly called for you.

What is Write-output in PowerShell?

Write-Output sends objects to the primary pipeline, also known as the "output stream" or the "success pipeline." To send error objects to the error pipeline, use Write-Error . This cmdlet is typically used in scripts to display strings and other objects on the console.

How do I declare an array in PowerShell?

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.


2 Answers

I kept having the same problem, and none of the solutions I found above or anywhere else would work in the general case. For example, the first answer above works only because the array is an array of strings. If it's an array of anything else, that solution breaks, and Write-Debug will output the object type, and not its value as one would expect.

Finally I found a general solution: The key point is to first convert the input object to a string using the Out-String command. Once everything is a string, the above solution works. Using "Out-String -stream" improves the output alignment. Example:

PS C:\> gwmi win32_bios

SMBIOSBIOSVersion : 786F3 v01.34
Manufacturer      : Hewlett-Packard
Name              : Default System BIOS
SerialNumber      : CZC8196Q8S
Version           : HPQOEM - 20120709

PS C:\> gwmi win32_bios | ft -auto

SMBIOSBIOSVersion Manufacturer    Name                SerialNumber Version
----------------- ------------    ----                ------------ -------
786F3 v01.34      Hewlett-Packard Default System BIOS CZC8196Q8S   HPQOEM - ...

PS C:\> $DebugPreference = "Continue"
PS C:\> gwmi win32_bios | ft -auto | Write-Debug
DEBUG: Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
DEBUG: Microsoft.PowerShell.Commands.Internal.Format.GroupStartData
DEBUG: Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData
DEBUG: Microsoft.PowerShell.Commands.Internal.Format.GroupEndData
PS C:\> gwmi win32_bios | ft -auto | Out-String | Write-Debug
DEBUG: SMBIOSBIOSVersion Manufacturer    Name                SerialNumber Version
----------------- ------------    ----                ------------ -------
786F3 v01.34      Hewlett-Packard Default System BIOS CZC8196Q8S   HPQOEM - ...

PS C:\> gwmi win32_bios | ft | Out-String -stream | Write-Debug
DEBUG:
DEBUG: SMBIOSBIOSVersi Manufacturer    Name            SerialNumber    Version
DEBUG: on
DEBUG: --------------- ------------    ----            ------------    -------
DEBUG: 786F3 v01.34    Hewlett-Packard Default Syst... CZC8196Q8S      HPQOEM - 201...
DEBUG:
DEBUG:PS C:\>
like image 59
Jean-François Larvoire Avatar answered Oct 21 '22 07:10

Jean-François Larvoire


If you want write-debug to handle each one separately:

[string[]]$test = @("test1", "test2", "test3")
 Write-Output $test
test1
test2
test3
$DebugPreference = "Inquire"
$test | Write-Debug 

DEBUG: test1
DEBUG: test2
DEBUG: test3
like image 23
mjolinor Avatar answered Oct 21 '22 06:10

mjolinor