Unterschied Windows Powershell / Powershell 7?
Hallo,
habe eine Frage zum Unterschied Powershell / Windows Powershell.
Ich schreibe schon seit geraumer Zeit ein Script für die Arbeit wobei zum Teil in Windows ISE probiert hab und zum Teil in VSCode. Da ist mir aufgefallen, dass in der folgende Code in PS 7 leer bleibt und in PS 5.1 ein ergebnis bringt.
Gibts eine möglichkeit das zu schreiben dass es in beiden Versionen funktoniert?
Der vereinfachte Code lautet:
$source = 'E:\Powershell_Skripts\99-Ordner_Test\Source'
$date_today_pattern = "20220525"
[array]$folder_today = Get-ChildItem -Path $source | Select-String -pattern "^$date_today_pattern"
$folder_today.GetType()
1 Antwort
ich musste auch erst mal grübeln. aber eigentlich ist es auch unter 5.1 totaler Quatsch ein komplexes Objekt als String zu behandeln.
- 5.1 greift bei solch einem absurden Vorgehen einfach auf fileobject.Name zu.?
- 7.x hat neue Properties spendiert bekommen: unter anderen fileobject.ResolvedName und dieses wird als String an Select-String übergeben?.
Get-ChildItem -Path $source |fl *
der Unterschied:
ResolvedTarget : C:\Users\Erzesel Secure\Desktop\test\20220525 blub
Name : 20220525 blub
Damit fällt dein Pattern mit einer Zeilenanfangsmarkiering(^Datumstring) natürlich ins Leere , den zwischen Zeilenanfang und deinem Datumstring kommt der Pfad. ...und wenn das Pattern nicht passt, wird auch nichts gefunden.
Wenn Du auf automatische Konvertierungen setzt, kann dies bei Änderungen im gelieferten Objekt mächtig in die Hose gehen...
Select-String ist dazu da um Texte zu durchsuchen, ein Object filtert man mit Where-Object , das ist sozusagen ein If, welches man auf einen Stapel Objekte anwendet..
$_ steht für das aktuelle Objekt die Vergleichsoperatoren sind die gleichen wie bei IF,
- https://docs.microsoft.com/de-de/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-7.2
- https://www.windowspro.de/script/vergleichsoperatoren-powershell-eq-lt-gt-contains-match
dann klappts auch ... und das gesamte Objekt wird weitergegeben und nicht nur was gerade mal automatisch als String angesehen wird ...
$source = 'C:\Users\Erzesel Secure\Desktop\test'
$date_today_pattern = "20220525"
[Array]$folder_today = Get-ChildItem -Path $source | Where-Object{$_.Name -like "$date_today_pattern*"}
$folder_today
Write-Host 'oder nur eine spezielle Property anzeigen übergeben...:' -fo blue
$folder_today.Name
#$folder_today.GetType()
pause
ob Du nun mit -like oder -match arbeitest ist eine Sache der Komplexität des zu filternden Strings. obiges -like lässt sich viel leichter handhaben.
-match braucht man eigentlich nur, wenn sich ein String nicht mehr per Wildcard definieren lässt.
das folgende Regexmatch macht das gleiche wie obiges -like :
#durchsuche alle Fileobject.Name nach Zeilenanfang20220525BeliebigesZeichen(keinmal oder oft)
[Array]$folder_today = Get-ChildItem -Path $source | Where-Object{$_.Name -match "^$date_today_pattern.*"}
Hallo Erzesel,
ich hatte lange gesucht um meine funktionierende Möglichkeit zu finden. Aber wie immer hatte ich das Problem dass ich an falscher Stelle gesucht hatte.
Auf jeden Fall vielen Dank für die super Erklärung und überhaupt deiner Zeit.
Werde in diesem Fall die -like Methode anwenden, aber werd mir -match mit den Umfangreichen Möglichkeiten von Regex im Hinterkopf behalten.