2011-08-03 15 views
7

Zacząłem używać transkrypcji startowej w moim profilu, aby zachować rejestr wszystkiego, co robię przez powłokę.PowerShell: czytanie zapisów PowerShell Transcript

Przydaje się przy przeglądaniu, jakie zmiany są wprowadzane i kiedy zostały wprowadzone. Zaczynam też używać go jako pierwszych kroków dokumentacji. Komentowałem rzeczy zrobione w powłoce, aby móc je wykorzystać w przyszłości.

To, co jest trudne, to formatowanie dokumentu tekstowego i nie jest tak łatwe do odczytania, jak powłoka (głównie błędy, pełne i ostrzegawcze kolory).

Zastanawiam się, czy ktokolwiek używa funkcjonalności Transcript w ten sposób i ma przeglądarkę preferencji lub skrypt, który parsuje plik dziennika, aby wyprodukować jakiś dokument?

Edit: Jestem zainteresowany, aby wiedzieć, dlaczego pytania został głosowali w dół ...

+0

plus jeden, jak mam podobny problem teraz też chciałbym, aby móc zobaczyć zabarwienie w dokumencie RTF lub HTML jako wyjście zamiast tylko zwykły tekst - zobacz rzeczy nieco jaśniejsze podczas przeglądania –

+0

Jestem prawie pewien, że nie ma sposobu, aby to zrobić z transkrypcją. Odkąd to powiedziałem, na pewno otrzymasz odpowiedź teraz;) Zabarwienie jest obsługiwane tylko przez konsolę (lub IDE). Dlatego 'Write-Host' zawiera' -ForegroundColor' i '-BackgroundColor', ale' Write-Output' nie. –

Odpowiedz

4

wierzę, to będzie bardzo trudne do analizowania zapis, aby stworzyć dokładny dokument sformatowany. Można jednak użyć interfejsu API hosta konsoli do przechwytywania (części) bufora ekranowego.

This W blogu Windows Power Shell opisano, jak to działa.

Prostym sposobem użycia skryptu (zmodyfikowanego) (Get-ConsoleAsHtml.ps1) jest zmodyfikowanie funkcji prompt, tak aby wszystkie linie z bufora, które nie zostały jeszcze zapisane w transkrypcie html, były zapisywane co czas wywołania funkcji podpowiedzi. Pierwszy blok kodu to zawartość zmodyfikowanego skryptu, drugi blok kodu pokazuje, jak możesz użyć tego skryptu w swoim profilu.

########################################################################################################### 
# Get-ConsoleAsHtml.ps1 
# 
# The script captures console screen buffer up to the current cursor position and returns it in HTML format. 
# (Jon Z: Added a startline parameter) 
# 
# Returns: UTF8-encoded string. 
# 
# Example: 
# 
# $htmlFileName = "$env:temp\ConsoleBuffer.html" 
# .\Get-ConsoleAsHtml 5 | out-file $htmlFileName -encoding UTF8 
# $null = [System.Diagnostics.Process]::Start("$htmlFileName") 
# 

param (
    $startline = 0 
) 

# Check the host name and exit if the host is not the Windows PowerShell console host. 
if ($host.Name -ne 'ConsoleHost') 
{ 
    write-host -ForegroundColor Red "This script runs only in the console host. You cannot run this script in $($host.Name)." 
    exit -1 
} 

# The Windows PowerShell console host redefines DarkYellow and DarkMagenta colors and uses them as defaults. 
# The redefined colors do not correspond to the color names used in HTML, so they need to be mapped to digital color codes. 
# 
function Normalize-HtmlColor ($color) 
{ 
    if ($color -eq "DarkYellow") { $color = "#eeedf0" } 
    if ($color -eq "DarkMagenta") { $color = "#012456" } 
    return $color 
} 

# Create an HTML span from text using the named console colors. 
# 
function Make-HtmlSpan ($text, $forecolor = "DarkYellow", $backcolor = "DarkMagenta") 
{ 
    $forecolor = Normalize-HtmlColor $forecolor 
    $backcolor = Normalize-HtmlColor $backcolor 

    # You can also add font-weight:bold tag here if you want a bold font in output. 
    return "<span style='font-family:Courier New;color:$forecolor;background:$backcolor'>$text</span>" 
} 

# Generate an HTML span and append it to HTML string builder 
# 
function Append-HtmlSpan 
{ 
    $spanText = $spanBuilder.ToString() 
    $spanHtml = Make-HtmlSpan $spanText $currentForegroundColor $currentBackgroundColor 
    $null = $htmlBuilder.Append($spanHtml) 
} 

# Append line break to HTML builder 
# 
function Append-HtmlBreak 
{ 
    $null = $htmlBuilder.Append("<br>") 
} 

# Initialize the HTML string builder. 
$htmlBuilder = new-object system.text.stringbuilder 
$null = $htmlBuilder.Append("<pre style='MARGIN: 0in 10pt 0in;line-height:normal';font-size:10pt>") 

# Grab the console screen buffer contents using the Host console API. 
$bufferWidth = $host.ui.rawui.BufferSize.Width 
$bufferHeight = $host.ui.rawui.CursorPosition.Y 
$rec = new-object System.Management.Automation.Host.Rectangle 0,0,($bufferWidth - 1),$bufferHeight 
$buffer = $host.ui.rawui.GetBufferContents($rec) 

# Iterate through the lines in the console buffer. 
for($i = $startline; $i -lt $bufferHeight; $i++) 
{ 
    $spanBuilder = new-object system.text.stringbuilder 

    # Track the colors to identify spans of text with the same formatting. 
    $currentForegroundColor = $buffer[$i, 0].Foregroundcolor 
    $currentBackgroundColor = $buffer[$i, 0].Backgroundcolor 

    for($j = 0; $j -lt $bufferWidth; $j++) 
    { 
    $cell = $buffer[$i,$j] 

    # If the colors change, generate an HTML span and append it to the HTML string builder. 
    if (($cell.ForegroundColor -ne $currentForegroundColor) -or ($cell.BackgroundColor -ne $currentBackgroundColor)) 
    { 
     Append-HtmlSpan 

     # Reset the span builder and colors. 
     $spanBuilder = new-object system.text.stringbuilder 
     $currentForegroundColor = $cell.Foregroundcolor 
     $currentBackgroundColor = $cell.Backgroundcolor 
    } 

    # Substitute characters which have special meaning in HTML. 
    switch ($cell.Character) 
    { 
     '>' { $htmlChar = '&gt;' } 
     '<' { $htmlChar = '&lt;' } 
     '&' { $htmlChar = '&amp;' } 
     default 
     { 
     $htmlChar = $cell.Character 
     } 
    } 

    $null = $spanBuilder.Append($htmlChar) 
    } 

    Append-HtmlSpan 
    Append-HtmlBreak 
} 

# Append HTML ending tag. 
$null = $htmlBuilder.Append("</pre>") 

return $htmlBuilder.ToString() 

Przykład profilu:

############################################################################################################ 
# Microsoft.PowerShell_profile.ps1 
# 

$docpath = [environment]::GetFolderPath([environment+SpecialFolder]::MyDocuments) 
$transcript = "$($docpath)\PowerShell_transcript.$(get-date -f 'yyyyMMddHHmmss').html"; 
$global:lastloggedline = 0 
function prompt { 
&'D:\Scripts\Get-ConsoleAsHtml.ps1' $global:lastloggedline | out-file $transcript -append; 
$global:lastloggedline = $host.ui.rawui.cursorposition.Y 
"PS $pwd$('>' * ($nestedPromptLevel + 1)) " 
} 
+0

ciekawy pomysł, że wkrótce będę musiał z nim porozmawiać – Matt

+0

DZIĘKI! to działało idealnie! –