korbi1328
Goto Top

Powershell - Logfile schreiben wenn Ordner erstellt

Hallo Zusammen,

in einem Script werden verschiedene Ordner erstellt und Registry-Keys angelegt, neben bei soll hierzu ein Logfile geschrieben werden.

New-Item "$env:ProgramFiles\NewFolder" -type directory

Jetzt soll abgefragt werden ob der Ordner erstellt wurde, wenn ja soll das im Logfile erscheinen, wenn nicht dann soll ein Error im Logfile erscheinen.

Schön wäre es wenn der Output von "verbose" im Logfile erscheinen würde.

Fällt jemanden dazu etwas ein?

Danke im Voraus!

Content-Key: 166138

Url: https://administrator.de/contentid/166138

Printed on: April 23, 2024 at 08:04 o'clock

Member: Pemo11
Pemo11 May 12, 2011 at 11:59:52 (UTC)
Goto Top
Hallo User,

Ich würde das FileSystemWatcher-Objekt benutzen mit dem sich ein bestimmtes Verzeichnis überwachen lässt und das Event per Register-ObjectEvent registrieren. Über den Action-Parameter kann man einen Skriptblock angeben, der als Job ausgeführt wird, wenn das Event später eintritt.

Der Output von Verbose lässt sich leider nicht umleiten. Das Logfle schreiben geht ja per Write-EventLog ganz einfach (wenn die Source existiert, ansonsten muss sie mit New-Eventlog angelegt werden).

Hier ist ein kleines Skript, das einen Ordner anlegt und über ein Event eine Meldung ausgibt, dass der Ordner angelegt wurde.
<#
 .Synopsis
 Anlegen von Ordnern überwachen
#>

$OrdnerPfad = "C:\PsTestDir"  
$OrdnerName = "Pemo"  
if (Test-Path -Path $OrdnerPfad)
{ Remove-Item -Path $OrdnerPfad }
New-Item -Path $OrdnerPfad -ItemType Directory | Out-Null

$Fsw = New-Object -TypeName System.IO.FileSystemWatcher
$Fsw.Path = $OrdnerPfad
$Fsw.EnableRaisingevents = $true

# Event registrieren
Register-ObjectEvent -InputObject $Fsw -EventName "Created" -SourceIdentifier FswCreate `  
  -Action { $Global:OrdnerCreated = $($Event.SourceArgs[1].FullPath);[System.Windows.Forms.MessageBox]::Show("Ordner $OrdnerCreated wurde angelegt.") } | Out-Null  
  

# Ordner anlegen - Verbose-Ausgabe kann nicht umgeleitet werden
$FolderCreated = New-Item -Path "$OrdnerPfad\$OrdnerName" -ItemType Directory  | Select -Exp FullName  
$FolderCreated
$OrdnerCreated

$Fsw.EnableRaisingEvents = $false
Unregister-Event -SourceIdentifier FswCreate
Get-Job -Name FswCreate -ErrorAction SilentlyContinue | Stop-Job -PassThru | Remove-Job -Force 
Ein wenig einfacher wäre natürlich, bei New-Item ein -ErrorAction = SilentlyContinue zu setzen und danach $? abzufragen. Der Event-Ansatz hat den Vorteil, dass dies nicht nach jedem Ordneranlegen geschehen muss.

Auf alle Fälle lässt sich daraus etwas machen.

Viele Grüße,
Pemo
[Edit Biber] Code-Formatierung [/Edit]
Member: Korbi1328
Korbi1328 May 12, 2011 at 13:39:54 (UTC)
Goto Top
Danke für die Antwort erstmal!

Bei deinem Beispiel-Script wird ja in einer Message Box ausgeben, wie kann ich in einem Textfile ausgeben?

Außerdem noch eine kurze Frage: Um mehrere Ordner anzulegen muss ich dazu nur den ersten Block kopieren, oder?

$OrdnerPfad = "C:\PsTestDir"
$OrdnerName = "Pemo"
if (Test-Path -Path $OrdnerPfad)
{ Remove-Item -Path $OrdnerPfad }
New-Item -Path $OrdnerPfad -ItemType Directory | Out-Null

Gruß Korbi
Member: Pemo11
Pemo11 May 12, 2011 at 16:44:06 (UTC)
Goto Top
Hallo Korbi,

Ja, die Messagebox dient nur zur Veranschaulichung - damit lässt sich feststellen, dass überhaupt etwas passiert. Der Teil muss wieder raus.
Um mehrere Ordner anzulegen würde ich die Namen eventuell zu einer Variablen zusammenfassen:

Hier ist ein kleines Skript, das ein paar Ordner anlegt und pro angelegtem Ordner eine Meldung in das Application-Log schreibt mit dem Ordnerpfad als Message, Die Quelle ist OrdnerTest.
<#
 .Synopsis
 Anlegen von Ordnern überwachen
#>

$OrdnerPfad = "C:\PsTestDir"  

if (Test-Path -Path $OrdnerPfad)
{ Remove-Item -Path $OrdnerPfad }
New-Item -Path $OrdnerPfad -ItemType Directory | Out-Null

$Fsw = New-Object -TypeName System.IO.FileSystemWatcher
$Fsw.Path = $OrdnerPfad
$Fsw.EnableRaisingevents = $true

# Event-Quelle anlegen
New-EventLog -LogName Application -Source OrdnerTest -ErrorAction SilentlyContinue

# Event registrieren
Register-ObjectEvent -InputObject $Fsw -EventName "Created" -SourceIdentifier FswCreate `  
  -Action { Write-EventLog -LogName Application -Source OrdnerTest -EventID 1000 -EntryType Information `
   -Message "Ordner $($Event.SourceArgs[1].FullPath) wurde angelegt." } | Out-Null  

$OrdnerListe = "Ordner1", "Ordner2", "Ordner3"  
  
$OrdnerListe | Foreach-Object { 
     New-Item -Path "$OrdnerPfad\$_" -ItemType Directory  
}

$Fsw.EnableRaisingEvents = $false
Unregister-Event -SourceIdentifier FswCreate
Get-Job -Name FswCreate -ErrorAction SilentlyContinue | Stop-Job -PassThru | Remove-Job -Force 
Das sollte die Aufgabe erledigen.

Viele Grüße,
Pemo
[Edit Biber] Code-Formatierung [/Edit]
Member: Korbi1328
Korbi1328 May 13, 2011 at 08:03:50 (UTC)
Goto Top
Hallo Pemo,

eine letzte Frage noch, mit dem FileSystemWatcher lässt sich ja nicht die Registry überwachen, wenn ich auf deine Weise Reg-Keys anlegen will. Gibt es hierzu etwas änliches?

Viele Grüße
Korbi
Member: Pemo11
Pemo11 May 13, 2011 at 09:23:19 (UTC)
Goto Top
Hallo Korbi,

Das geht auch, per WMI und einer WMI-Event-Klasse. Es ist sogar relativ einfach:
<#
 .Synopsis
 Registry-Überwachung
#>

$WQLQuery = @"  
Select * From RegistryKeyChangeEvent Where Hive = 'HKEY_LOCAL_MACHINE' and KeyPath = 'Software\\Pemo'  
"@  

Register-WmiEvent -query $WQLQuery -SourceIdentifier RegEvent `
 -Action { $RegPfad = [System.Windows.Forms.MessageBox]::Show("Neuer Subkey in $($Event.SourceEventArgs.NewEvent.KeyPath)") }  

#Unregister-Event -SourceIdentifier RegEvent
Der Name des neu angelegten Subkeys lässt sich meiner Meinung nach nicht abfragen (oder er versteckt sich in den Tiefen von dem Objekt, das über $Event angesprochen wird).

Das Ganze ist gut dokumentiert. Hier gibt es z.B. noch mehr dazu:

http://poshcode.org/2501

VIele Grüße,

Pemo
[Edit Biber] Code-Formatierung [/Edit]