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!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 166138
Url: https://administrator.de/forum/powershell-logfile-schreiben-wenn-ordner-erstellt-166138.html
Ausgedruckt am: 01.05.2025 um 00:05 Uhr
5 Kommentare
Neuester Kommentar
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.
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]
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
Auf alle Fälle lässt sich daraus etwas machen.
Viele Grüße,
Pemo
[Edit Biber] Code-Formatierung [/Edit]
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.
Das sollte die Aufgabe erledigen.
Viele Grüße,
Pemo
[Edit Biber] Code-Formatierung [/Edit]
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
Viele Grüße,
Pemo
[Edit Biber] Code-Formatierung [/Edit]
Hallo Korbi,
Das geht auch, per WMI und einer WMI-Event-Klasse. Es ist sogar relativ einfach:
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]
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
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]