如下所示,一个数组作为写输出的输入正常工作,但不适用于写调试(我希望它们比它更相似)。
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吗?如果是这样,任何人都有一个最喜欢的简单解决方法?
答案 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-Host
和Write-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>] ...