PowerShell Write-Debug不会输出数组,但Write-Output会输出数组。这是故意的吗?

时间:2011-07-05 23:47:30

标签: powershell

如下所示,一个数组作为写输出的输入正常工作,但不适用于写调试(我希望它们比它更相似)。

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:\>

我认为这只是一个不幸的设计,但希望有一个明智的解释。我正确使用Write-Debug吗?如果是这样,任何人都有一个最喜欢的简单解决方法?

4 个答案:

答案 0 :(得分:14)

我一直遇到同样的问题,我在上面或其他任何地方找到的解决方案都不适用于一般情况。 例如,上面的第一个答案只是因为数组是一个字符串数组。如果它是其他任何数组,那么该解决方案就会中断,而Write-Debug将输出对象类型,而不是它所期望的值。

最后我找到了一个通用的解决方案:关键是首先使用Out-String命令将输入​​对象转换为字符串。一旦所有内容都是一个字符串,上述解决方使用“Out-String -stream”可改善输出对齐。 例如:

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:\>

答案 1 :(得分:6)

如果你想让write-debug分别处理每一个:

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

DEBUG: test1
DEBUG: test2
DEBUG: test3

答案 2 :(得分:1)

Write-Debug用于在特定way中设置调试首选项时输出简单消息。它只需要一个字符串,而不仅仅是Write-Host所做的任何事情(以及神奇的格式)。您必须自己将输出格式化为单个字符串。

如果您在提示用户之前有额外的信息要输出,则可以合并Write-HostWrite-Debug

if ($DebugPreference -ne 'SilentlyContinue') {
    Write-Host 'such-and-such array:' $array
}
Write-Debug 'such-and-such array dumped'
使用

Write-Host是因为它总是写入控制台主机,而不是像Write-Output那样写入脚本的输出。如果您将脚本的标准输出重定向到文件,Write-Output将在文件中结束,而在控制台中仍会显示Write-Host

如果您的数组类型足够自动调用ToString()(如果它们不是字符串)可以获得您想要的内容,那么您也可以尝试这样做:

$array = 'Alice','Bob','Charlie'
Write-Debug ([String]::Join("`n", $array))

答案 3 :(得分:0)

写调试:

Write-Debug [-Message] <string> [<CommonParameters>]

它需要一个字符串。如错误所示,它无法将字符串数组转换为字符串。它期望字符串的原因是它writes debug messages to the console from a script or command.

请注意,Write-Output和Write-Host接受一个对象:

Write-Output [-InputObject] <PSObject[]> [<CommonParameters>]

Write-Host [[-Object] <Object>] ...