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

Vim*_*mes 11 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:\>
Run Code Online (Sandbox Code Playgroud)

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

Jea*_*ire 15

我一直遇到同样的问题,我在上面或其他任何地方找到的解决方案都不适用于一般情况.例如,上面的第一个答案只是因为数组是一个字符串数组.如果它是其他任何数组,那么该解决方案就会中断,而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:\>
Run Code Online (Sandbox Code Playgroud)


mjo*_*nor 7

如果您希望write-debug分别处理每个:

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

DEBUG: test1
DEBUG: test2
DEBUG: test3
Run Code Online (Sandbox Code Playgroud)