Write-Debug PowerShell не будет выводить массивы, а Write-Output -. Это специально? - PullRequest
10 голосов
/ 06 июля 2011

Как показано ниже, массив отлично работает в качестве входных данных для записи-вывода, но не для записи-отладки (я ожидал, что они будут более похожими). ​​

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 ]

14 голосов
/ 12 сентября 2013

У меня продолжала возникать та же проблема, и ни одно из решений, которые я нашел выше или где-либо еще, не сработало бы в общем случае. Например, первый ответ выше работает только потому, что массив является массивом строк. Если это массив чего-либо еще, это решение нарушается, и 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:\>
7 голосов
/ 06 июля 2011

Если вы хотите, чтобы write-debug обрабатывал каждый из них отдельно:

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

DEBUG: test1
DEBUG: test2
DEBUG: test3
1 голос
/ 06 июля 2011

Write-Debug предназначен для вывода простых сообщений, когда настройки отладки установлены определенным способом . Требуется только строка, а не просто что-то, что делает 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))
0 голосов
/ 06 июля 2011

Write-Debug:

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>] ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...