Как писать в поток отладки с помощью PowerShell Core, чтобы он был захвачен SysInternals DBGVIEW.EXE

У меня есть множество скриптов, которые используют OutputDebugString Windows API для вывода значимой информации о состоянии, так что, когда они работают в производственной среде, я могу открыть средство просмотра отладки SysInternals и посмотреть, что все происходит.

Когда выйдет PowerShell Core 7, я бы хотел переместить свои скрипты, чтобы воспользоваться новыми функциями. Я ожидал, что этот специфичный для Windows код будет работать, пока я запускаю Pwsh.exe в Windows, но я ошибался.

Write-Debug совершенно не помогает.

Существует ли кросс-платформенный способ вывода сообщений, которые в Windows могут быть прочитаны программой Debug Viewer?

FWIW, вот код, который я использую очень давно:

$VB = @"
'http://www.pinvoke.net/default.asp
Public Class WinAPI
    <System.Runtime.InteropServices.DllImport("kernel32.dll")> _
    Public Shared Sub OutputDebugString(ByVal lpOutputString As String)
    End Sub
End Class
"@

Add-Type $VB -Language Visualbasic

function Write-DebugMessage([string]$Message)
{
    $Msg = "[$Script:ScriptHelperAppName] $Message"
    [WinAPI]::OutputDebugString($Msg)
    Write-Verbose $Msg
}


person Kevin Buchan    schedule 23.02.2020    source источник


Ответы (1)


Хорошо, это было до неприличия просто. Мне никогда не приходило в голову, что pwsh.exe сможет компилировать один язык .Net, но не другой.

Я только что преобразовал код .Net в C #, и он отлично работает.

$WinAPI = @"
    public class WinAPI
    {
    [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    public static extern void OutputDebugString(string message);
    }
"@

Add-Type $WinAPI -Language CSharp

[WinAPI]::OutputDebugString("C# Test")
person Kevin Buchan    schedule 05.03.2020