hacktrist
Goto Top

Power Shell: Ordner mit aktuellem Jahr wählen

Hallo,

ich möchte gern prüfen lassen ob sich eine XML-Datei im Ordner mit dem aktuellsten/letzten vorhanden Jahr befindet.
Wenn nicht, soll eine Meldung ausgegeben werden.

Ordnerstruktur:
C:\Arbeitsordner\2015
C:\Arbeitsordner\2016
C:\Arbeitsordner\2017
C:\Arbeitsordner\2018
C:\Arbeitsordner\2019
C:\Arbeitsordner\2020

Jetzt soll das Skript automatisch den Ordner C:\Arbeitsordner\2020 auf XML-Datein prüfen.

Klar ist, dass ich das mit
if (!(Test-Path "C:\Arbeitsordner\  
beginne und mit
Write-Host "Keine XML Datei zu Verarbeitung vorhanden"  
beende.

Aber wie teile ich Power Shell mit, dass er die letzte Jahreszahl als Prüfordner nimmt?

Content-ID: 666222

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

Ausgedruckt am: 05.11.2024 um 06:11 Uhr

Doskias
Doskias 29.04.2021 aktualisiert um 08:05:54 Uhr
Goto Top
Moin,

schau dir mal den Befehl get-date in Powershell an. Das aktuelle Jahr erhälst du zum Beispiel mit
get-date -format yyyy

Wie du Tage, Monate oder Jahre hinzufügst (oder abziehst) ist hier https://devblogs.microsoft.com/scripting/adding-and-subtracting-dates-wi ... gut beschrieben.

Gruß
Doskias
148121
Lösung 148121 29.04.2021 aktualisiert um 09:17:37 Uhr
Goto Top
im Ordner mit dem aktuellsten/letzten vorhanden Jahr befindet.
$latestyearfolder = ls 'c:\arbeitsordner' -Directory | sort {[int]$_.Name} -desc | select -F 1  
Gruß w
Hacktrist
Hacktrist 29.04.2021 aktualisiert um 09:57:18 Uhr
Goto Top
Ich habe es jetzt wie folgt umgesetzt.
Leider wird der Fehler auch angezeigt, wenn ich im Unterordner 2020 eine XML Datei enthalten habe.

Kann mir Bitte jemand den Code korrigieren oder sagen wo ich den Denkfehler habe?
$latestyearfolder = ls 'C:\Arbeitsordner\' -Directory | sort {[int]$_.Name} -desc | select -F 1  

if (!(Test-Path '$latestyearfolder\*.xml'))   

{
    Write-Host "Fehler: Keine XML Datei zur Verarbeitung enthalten." -ForegroundColor Red   
} 
148121
Lösung 148121 29.04.2021 aktualisiert um 10:02:01 Uhr
Goto Top
$latestyearfolder ist ein Objekt vom Typ [fileinfo], kein String! Ergo ...
if (!(Test-Path "$($latestyearfolder.Fullname)\*.xml"))   
oder auch so wenn man den Pfad als String in die Variable pappt, dann kann du die IF-Abfrage so lassen
$latestyearfolder = ls 'C:\Arbeitsordner\' -Directory | sort {[int]$_.Name} -desc | select -F 1 -Expand Fullname  
if (!(Test-Path '$latestyearfolder\*.xml')) {  
    Write-Host "Fehler: Keine XML Datei zur Verarbeitung enthalten." -ForegroundColor Red   
} 
Hacktrist
Hacktrist 29.04.2021 um 10:05:07 Uhr
Goto Top
Das klappt wunderbar.

Danke für die Erklärung @148121
Hacktrist
Hacktrist 29.04.2021 um 10:38:22 Uhr
Goto Top
Ich habe in dem Ordner leider auch noch andere Ordner drin, welche auch nachher angelegt werden könnten.
Jedoch soll immer der Ordner mit der aktuellsten Jahreszahl geprüft werden. Der Hintergrund sind hier Jahresberichte, welche Monatlich neu berechnet werden müssen.

C:\Arbeitsordner\2015
C:\Arbeitsordner\2016
C:\Arbeitsordner\2017
C:\Arbeitsordner\2018
C:\Arbeitsordner\2019
C:\Arbeitsordner\2020
C:\Arbeitsordner\Anderer_Ordner_1
C:\Arbeitsordner\Anderer_Ordner_2
C:\Arbeitsordner\Anderer_Ordner_3

Kann man das auch einbinden? Wenn ich das richtig verstehe, wird ja aktuell im folgenden nur der Name der Ordner Sortiert, oder?

$latestyearfolder = ls 'C:\Arbeitsordner\Testordner\' -Directory | sort {[int]$_.Name} -desc | select -F 1  

if (!(Test-Path "$($latestyearfolder.Fullname)\*.xml"))    

{
    Write-Host "Fehler: Keine XML Datei zur Verarbeitung enthalten." -ForegroundColor Red   
} 
148121
Lösung 148121 29.04.2021 aktualisiert um 10:54:28 Uhr
Goto Top
$latestyearfolder = ls 'C:\Arbeitsordner\Testordner' -Directory | ?{$_.Name -match '^\d{4}$'} | sort {[int]$_.Name} -desc | select -F 1  
oder auch so wenn nur die Anzahl der Zeichen auf 4 begrenzt werden soll
$latestyearfolder = ls 'C:\Arbeitsordner\Testordner\????' -Directory | sort {[int]$_.Name} -desc | select -F 1  
Hacktrist
Hacktrist 29.04.2021 aktualisiert um 11:05:47 Uhr
Goto Top
Perfekt.
?{$_.Name -match '\d{4}'}   
Das sagt mir wieviele Zeichen der Ordner haben soll, richtig?

Hier wieder die Lösung am Ende des Beitrags für alle, die auf die gleiche Frage im Forum stoßen:

$latestyearfolder = ls 'C:\Arbeitsordner\Testordner' -Directory | ?{$_.Name -match '^\d{4}$'} | sort {[int]$_.Name} -desc | select -F 1  

if (!(Test-Path "$($latestyearfolder.Fullname)\*.xml"))    

{
    Write-Host "Fehler: Keine XML Datei zur Verarbeitung enthalten." -ForegroundColor Red   
} 

Riesendank geht raus an @148121
148121
Lösung 148121 29.04.2021 aktualisiert um 11:11:14 Uhr
Goto Top
Zitat von @Hacktrist:

Perfekt.
?{$_.Name -match '^\d{4}$'}   
Das sagt mir wieviele Zeichen der Ordner haben soll, richtig?
Nicht ganz, das sagt aus. dass der Ordner aus exakt 4 Zahlen bestehen muss. Das ist Regular Expression Syntax
Regular Expressions Tutorial
Achtung ich hatte den Regex nachträglich noch korrigiert, Caret und Dollar hatten noch gefehlt.
Riesendank geht raus an @148121
Biddö. face-smile

p.s. Sowas hier geht übrigens auch mit den Bordeigenen Filesystem Filters
$latestyearfolder = ls 'C:\Arbeitsordner\Testordner\2[0-9][0-9][0-9]' -Directory | sort {[int]$_.Name} -desc | select -F 1  
Hacktrist
Hacktrist 29.04.2021 um 11:06:50 Uhr
Goto Top
Das Tutorial ziehe ich mir gleich mal rein.

Übrigens. Das Zeichen ^ heißt nicht Tilde. Das hier ist Tilde ~.
Oder?
148121
148121 29.04.2021 aktualisiert um 11:12:28 Uhr
Goto Top
Zitat von @Hacktrist:
Übrigens. Das Zeichen ^ heißt nicht Tilde. Das hier ist Tilde ~.
Oder?
Ja richtig, ist das Zirkumflex bzw. Caret, Name verwechsele ich manchmal face-smile.
Hacktrist
Hacktrist 29.04.2021 um 11:13:49 Uhr
Goto Top
Ich schließe mal den Beitrag ab face-smile

Hier wieder die Lösung am Ende des Beitrags für alle, die auf die gleiche Frage im Forum stoßen:
$latestyearfolder = ls 'C:\Arbeitsordner\Testordner' -Directory | ?{$_.Name -match '^\d{4}$'} | sort {[int]$_.Name} -desc | select -F 1  

if (!(Test-Path "$($latestyearfolder.Fullname)\*.xml"))    

{
    Write-Host "Fehler: Keine XML Datei zur Verarbeitung enthalten." -ForegroundColor Red   
}