2017-01-17 4 views
0

Erstens möchte ich darauf hinweisen, dass ich ein PowerShell ScrapBooker bin und nicht wirklich viel Wissen über PowerShell.Powershell Log-Datei

Ich habe an einem Skript gearbeitet, das BGInfo installiert ... Ich habe die eigentliche Installation und Deinstallation funktioniert perfekt, und jetzt mache ich weiter, um die Protokollierung gut sortiert zu bekommen.

Ich fand diesen Artikel "Create Log File in Powershell", der wunderbar war und diese Funktion in mein Skript integriert hat.

Function Write-Log { 
[CmdletBinding()] 
Param(
[Parameter(Mandatory=$False)] 
[ValidateSet("LABEL","INFO","WARN","ERROR","FATAL","DEBUG")] 
[String] 
$Level = "INFO", 

[Parameter(Mandatory=$True)] 
[string] 
$Message, 

[Parameter(Mandatory=$False)] 
[string] 
$logfile 
) 

$Stamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss") 
IF ($Level -eq "LABEL") { 
    $Line = "$Message" 
    } 
ELSE { 
    $Line = "$Stamp $Level $Message" 
    } 
If($logfile) { 
    Add-Content $logfile -Value $Line 
} 
Else { 
    Write-Output $Line 
} 
} 

Was ich wissen muss, ist, wie man dies verwendet, um die Ausgabe von Befehlen zu protokollieren.

Beispiel:

In meinem Skript habe ich diesen Befehl ein:

New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' -Name BgInfo -Value """$InstPath\Bginfo.exe"" $InstPath\$BGTemplateFile $InstOptions" -PropertyType 'String' -Force 

oder diese ein:

Copy $SourcePath\Bginfo.exe $InstPath 

Was Ich mag würde, wissen, wie ich meine Funktion verwenden kann um alle Ausgaben dieses Befehls zu erfassen und in meiner Protokolldatei zu protokollieren.

Ich denke, dass ich diese Informationen auch gerne verwenden und auf alle anderen Befehle anwenden würde, wo ich etwas protokollieren möchte.

Hoffentlich ist das alles klar und macht Sinn und dass mir jemand helfen kann.

Cheers,

Dave.

:)

+0

Es gibt einige andere Optionen, aber sehen Sie sich 'Start-Transcript' an und prüfen Sie, ob es Ihren Anforderungen entspricht. –

+0

Danke @MatthewWetmore - Ich werde mir das ansehen. :) –

+0

Ich kann eine richtige Antwort von Mobile nicht tun, aber wenn Sie wirklich die Ausgabe von Befehlen in Ihre Protokollierungsfunktion leiten möchten, lautet der Ansatz "ValueFromPipeline". Ich werde morgen ein Beispiel bekommen. Siehe auch: https://technet.microsoft.com/en-us/library/hh360993.aspx –

Antwort

1

Ich glaube, Sie beziehen sich auf diese Funktion:

function Write-Log 
{ 
    [CmdletBinding()] 
    Param 
    ( 
     [Parameter(Mandatory=$true, 
        ValueFromPipelineByPropertyName=$true)] 
     [ValidateNotNullOrEmpty()] 
     [Alias("LogContent")] 
     [string]$Message, 

     [Parameter(Mandatory=$false)] 
     [Alias('LogPath')] 
     [string]$Path='C:\Logs\PowerShellLog.log', 

     [Parameter(Mandatory=$false)] 
     [ValidateSet("Error","Warn","Info")] 
     [string]$Level="Info", 

     [Parameter(Mandatory=$false)] 
     [switch]$NoClobber 
    ) 

    Begin 
    { 
     # Set VerbosePreference to Continue so that verbose messages are displayed. 
     $VerbosePreference = 'Continue' 
    } 
    Process 
    { 

     # If the file already exists and NoClobber was specified, do not write to the log. 
     if ((Test-Path $Path) -AND $NoClobber) { 
      Write-Error "Log file $Path already exists, and you specified NoClobber. Either delete the file or specify a different name." 
      Return 
      } 

     # If attempting to write to a log file in a folder/path that doesn't exist create the file including the path. 
     elseif (!(Test-Path $Path)) { 
      Write-Verbose "Creating $Path." 
      $NewLogFile = New-Item $Path -Force -ItemType File 
      } 

     else { 
      # Nothing to see here yet. 
      } 

     # Format Date for our Log File 
     $FormattedDate = Get-Date -Format "yyyy-MM-dd HH:mm:ss" 

     # Write message to error, warning, or verbose pipeline and specify $LevelText 
     switch ($Level) { 
      'Error' { 
       Write-Error $Message 
       $LevelText = 'ERROR:' 
       } 
      'Warn' { 
       Write-Warning $Message 
       $LevelText = 'WARNING:' 
       } 
      'Info' { 
       Write-Verbose $Message 
       $LevelText = 'INFO:' 
       } 
      } 

     # Write log entry to $Path 
     "$FormattedDate $LevelText $Message" | Out-File -FilePath $Path -Append 
    } 
    End 
    { 
    } 
} 

Verbrauch:

Write-Log -Message 'My log Error Message' -Path c:\Logs\Script.log -Level Error 

Write-Log -Message 'My log Warning message' -Level Warn 

Hinweis: standardmäßig seine Speicherung in C: \ logs \ PowershellLog.log. Sie können es während der Verwendung auch ändern und Sie können es in der Funktion selbst fest codieren.

Ich hoffe, es hilft.

+0

Das ist die gleiche Art von Funktion, aber Sie haben die eigentliche Frage in der Post verpasst. –

+0

Sie erwähnten, wie man irgendeine Ausgabe gefangen nimmt und es in Protokoll einträgt, wenn ich nicht falsch bin @DavidBuckley –

+0

Yes .. aber Ihre Funktion tut genau die gleiche Sache, die meins tut ..., die mich "Senden" Nachrichten zur Protokolldatei lässt. .. was es nicht tut, ist die Ausgabe von einigen Befehlen zu erfassen ... wenn es sich um Fehler handelt oder nicht und diese mit meiner Funktion an die Logdatei senden. Bitte lesen Sie die Beispiele erneut. –

Verwandte Themen