Unterschied Windows Powershell / Powershell 7?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

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,

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.*"} 
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
DNSxxx 
Fragesteller
 28.05.2022, 20:36

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.

1