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-Key: 666222

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

Printed on: April 19, 2024 at 01:04 o'clock

Member: Doskias
Doskias Apr 29, 2021 updated at 06:05:54 (UTC)
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
Mitglied: 148121
Solution 148121 Apr 29, 2021 updated at 07:17:37 (UTC)
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
Member: Hacktrist
Hacktrist Apr 29, 2021 updated at 07:57:18 (UTC)
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   
} 
Mitglied: 148121
Solution 148121 Apr 29, 2021 updated at 08:02:01 (UTC)
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   
} 
Member: Hacktrist
Hacktrist Apr 29, 2021 at 08:05:07 (UTC)
Goto Top
Das klappt wunderbar.

Danke für die Erklärung @148121
Member: Hacktrist
Hacktrist Apr 29, 2021 at 08:38:22 (UTC)
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   
} 
Mitglied: 148121
Solution 148121 Apr 29, 2021 updated at 08:54:28 (UTC)
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  
Member: Hacktrist
Hacktrist Apr 29, 2021 updated at 09:05:47 (UTC)
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
Mitglied: 148121
Solution 148121 Apr 29, 2021 updated at 09:11:14 (UTC)
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  
Member: Hacktrist
Hacktrist Apr 29, 2021 at 09:06:50 (UTC)
Goto Top
Das Tutorial ziehe ich mir gleich mal rein.

Übrigens. Das Zeichen ^ heißt nicht Tilde. Das hier ist Tilde ~.
Oder?
Mitglied: 148121
148121 Apr 29, 2021 updated at 09:12:28 (UTC)
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.
Member: Hacktrist
Hacktrist Apr 29, 2021 at 09:13:49 (UTC)
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   
}