Powershell - Befehlsausgabe in Variable speichern
Hallo zusammen,
ich habe hier ein PowerShell-Skript, welches mir auf unserem Exchange-Server (Windows Server 2012 R2, Exchange 2016 CU9) Log-Dateien mit einer bestimmten Endung löschen soll, wenn diese älter als 7 Tage sind.
Knackpunkt ist die Zeile "$Files = Get-ChildItem.......". Ab dieser Stelle produziert das Skript einen Fehler, dass es nicht den Inhalt auslesen kann (Permission denied). Führe ich den Befehl jedoch über die Shell direkt aus, ohne den Inhalt in eine Variable zu speichern, dann klappt alles.
Dieses Skript ging bis letzte Woche noch und wir haben kein Update eingespielt oder sonst irgendeine Anpassung am System vorgenommen.
Wo habe ich hier den Denkfehler? Ich sehe den Wald vor lauter Bäumen nicht.
Vielen Dank schonmal im Vorraus.
Stephan
ich habe hier ein PowerShell-Skript, welches mir auf unserem Exchange-Server (Windows Server 2012 R2, Exchange 2016 CU9) Log-Dateien mit einer bestimmten Endung löschen soll, wenn diese älter als 7 Tage sind.
Set-Executionpolicy RemoteSigned
$days=7
$IISLogPath="C:\inetpub\logs\LogFiles\"
$IISLogPathAux="F:\Logs\"
$ExchangeLoggingPath='C:\Program Files\Microsoft\Exchange Server\V15\Logging\'
$ETLLoggingPath="C:\Program Files\Microsoft\Exchange Server\V15\Bin\Search\Ceres\Diagnostics\ETLTraces\"
$ETLLoggingPath2="C:\Program Files\Microsoft\Exchange Server\V15\Bin\Search\Ceres\Diagnostics\Logs\"
$IISHTTPErrLoggingPath="C:\Windows\System32\LogFiles\HTTPERR\"
Function CleanLogfiles($TargetFolder)
{
if (Test-Path $TargetFolder) {
$Now = Get-Date
$LastWrite = $Now.AddDays(-$days)
$Files = Get-ChildItem $TargetFolder -Include *.log, *.etl, *.blg, *.txt, *.LOG, *.ETL, *.BLG, *.TXT -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}
foreach ($File in $Files)
{
Write-Host "Deleting file $File" -ForegroundColor "white"
Remove-Item $File -ErrorAction SilentlyContinue | out-null
}
}
Else {
Write-Host "The folder $TargetFolder doesn't exist! Check the folder path!" -ForegroundColor "white"
}
}
CleanLogfiles($IISLogPath)
CleanLogfiles($IISLogPathAux)
CleanLogfiles($ExchangeLoggingPath)
CleanLogfiles($ETLLoggingPath)
CleanLogfiles($ETLLoggingPath2)
CleanLogfiles($IISHTTPErrLoggingPath)
Knackpunkt ist die Zeile "$Files = Get-ChildItem.......". Ab dieser Stelle produziert das Skript einen Fehler, dass es nicht den Inhalt auslesen kann (Permission denied). Führe ich den Befehl jedoch über die Shell direkt aus, ohne den Inhalt in eine Variable zu speichern, dann klappt alles.
Dieses Skript ging bis letzte Woche noch und wir haben kein Update eingespielt oder sonst irgendeine Anpassung am System vorgenommen.
Wo habe ich hier den Denkfehler? Ich sehe den Wald vor lauter Bäumen nicht.
Vielen Dank schonmal im Vorraus.
Stephan
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 383236
Url: https://administrator.de/contentid/383236
Ausgedruckt am: 05.11.2024 um 17:11 Uhr
7 Kommentare
Neuester Kommentar
Hallo Stephan,
ich habe den Code mal schnell etwas zusammengekürzt, was aber an der Funktion nichts ändern sollte.
Soweit ich das sehe, hast du mal keinen Fehler im Code:
Kann es sein, dass du zwar über die Shell auf einen Pfad zugreifen kannst ,sprich rechte hast (als Admin?) und dann wenn du das Script so startest nicht hast?
Vielleicht versucht du mal Ordner für Ordner durch.
Bei mir macht es am Client mal keinen Unterschied, ob du es über die Shell oder so ausführst.
Grüße
Christian
ich habe den Code mal schnell etwas zusammengekürzt, was aber an der Funktion nichts ändern sollte.
Soweit ich das sehe, hast du mal keinen Fehler im Code:
Set-Executionpolicy RemoteSigned
$days=7
$IISLogPath="E:\temp\log\"
Function CleanLogfiles($TargetFolder)
{
if (Test-Path $TargetFolder) {
$Now = Get-Date
$LastWrite = $Now.AddDays(-$days)
$Files = Get-ChildItem $TargetFolder -Include *.log, *.etl, *.blg, *.txt, *.LOG, *.ETL, *.BLG, *.TXT -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}
foreach ($File in $Files)
{
Write-Host "Deleting file $File" -ForegroundColor "white"
Remove-Item $File -ErrorAction SilentlyContinue | out-null
}
}
Else {
Write-Host "The folder $TargetFolder doesn't exist! Check the folder path!" -ForegroundColor "white"
}
}
CleanLogfiles($IISLogPath)
Kann es sein, dass du zwar über die Shell auf einen Pfad zugreifen kannst ,sprich rechte hast (als Admin?) und dann wenn du das Script so startest nicht hast?
Vielleicht versucht du mal Ordner für Ordner durch.
Bei mir macht es am Client mal keinen Unterschied, ob du es über die Shell oder so ausführst.
Grüße
Christian
Hi,
spontan fällt mir auf
Aber zur Frage:
Du willst uns sagen, wenn Du
kommt ein Fehler, aber wenn Du
dann kommt keiner?
Reden wir von Scheduled Task?
Falls ja:
E.
spontan fällt mir auf
$_.LastWriteTime -le "$LastWrite"
Sollte das nicht einfach lauten ..?$_.LastWriteTime -le $LastWrite
Aber zur Frage:
Du willst uns sagen, wenn Du
$Files = Get-ChildItem $TargetFolder -Include *.log, *.etl, *.blg, *.txt, *.LOG, *.ETL, *.BLG, *.TXT -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}
Get-ChildItem $TargetFolder -Include *.log, *.etl, *.blg, *.txt, *.LOG, *.ETL, *.BLG, *.TXT -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}
Reden wir von Scheduled Task?
Falls ja:
Permission denied
suggeriert mir, dass Du den Task "mit höchsten Privilegien" laufen lassen musst?E.
Gut, dass ich gefragt habe. Denn Deine Aussage sind immer noch etwas "wirr", sorry.
Ich verstehe immer noch nicht, warum Du schreibst
Also mal klare Frage-Antwort:
Was kommt, wenn Du ohne Skript direkt auf der Kommandozeile eingibst: ?
Ich verstehe immer noch nicht, warum Du schreibst
Führe ich den Befehl direkt auf der PowerShell aus
Wie machst Du das denn anders ("indirekt"?), wenn Dudie Ausgabe des Befehls in eine Variable speichern
?Wenn ich das Skript über eine privilegierte Shell direkt starte, taucht der Fehler auch auf.
Na dann brauchen wir also nicht mehr über den Scheduled Task zu reden. Das wäre geklärt.Also mal klare Frage-Antwort:
Was kommt, wenn Du ohne Skript direkt auf der Kommandozeile eingibst: ?
$Files = Get-ChildItem $TargetFolder -Include *.log, *.etl, *.blg, *.txt, *.LOG, *.ETL, *.BLG, *.TXT -Recurse | Where {$_.LastWriteTime -le $LastWrite}
OK, danke.
Habe jetzt auch keine Idee mehr ...
Klammern?
Und wenn nur...?
Habe jetzt auch keine Idee mehr ...
Klammern?
$Files = (Get-ChildItem $TargetFolder -Include *.log, *.etl, *.blg, *.txt, *.LOG, *.ETL, *.BLG, *.TXT -Recurse | Where {$_.LastWriteTime -le LastWrite})
$Files = Get-ChildItem $TargetFolder -Include *.log, *.etl, *.blg, *.txt, *.LOG, *.ETL, *.BLG, *.TXT -Recurse