Dot.Net Bug?
Ich habe möglicherweise einen Bug gefunden, da der Befehl aus C# u.o. DotNet kommt, wollte ich fragen ob ihr den evtl. bestätigen könnt.
Mein Powershell-Skript überprüft mit diesem Befehl, ob die Dateien im Zielpfad einem bestimmten Kriterium entsprechen:
Jetzt der Bug:
In
D:\Testordner\
Liegen momentan 2 Dateien:
Versuchskamera.asc
Versuchs.asc
Gefunden wird die 1. Datei weil sie angeblich dem Kriterium "*~*.ASC" entspricht. Stimmt offensichtlich nicht.
Wenn man jetzt Versuchs.asc in Versuchsk.asc umbenennt, dann wird auch diese Datei gefunden.
Geht der mit ~ irgendwie seltsam um oder wie ist das möglich?
Mein Powershell-Skript überprüft mit diesem Befehl, ob die Dateien im Zielpfad einem bestimmten Kriterium entsprechen:
$pfad="D:\Testordner\"
$Kriterien=@("*~*.ASC" , "*.*_ASC");
foreach ($Kriterium in $Kriterien)
{
$Dateien = @([System.IO.Directory]::GetFiles("$pfad","$Kriterium","AllDirectories"))
$Dateien
}
In
D:\Testordner\
Liegen momentan 2 Dateien:
Versuchskamera.asc
Versuchs.asc
Gefunden wird die 1. Datei weil sie angeblich dem Kriterium "*~*.ASC" entspricht. Stimmt offensichtlich nicht.
Wenn man jetzt Versuchs.asc in Versuchsk.asc umbenennt, dann wird auch diese Datei gefunden.
Geht der mit ~ irgendwie seltsam um oder wie ist das möglich?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 255280
Url: https://administrator.de/forum/dot-net-bug-255280.html
Ausgedruckt am: 02.04.2025 um 05:04 Uhr
2 Kommentare
Neuester Kommentar
Moin,
erst einmal dein Skript korrigiert. In deiner Fassung ist es nämlich nicht auffähig.
Ich kann dein Verhalten nachstellen. Allerdings bin ich mir nicht sicher, ob die Tilde "~" als solches behandelt wird in einem String. Ich kann mir auch vorstellen, dass es ein Special Char ist.
Mit Regex kommen wir an der Stelle auch nicht weiter, da die Methode get-Files dies nicht unterstützt:
Ich habe es alternativ mit dem CommandLet (Get-ChildItem) versucht, aber da ist es genau das selbe Ergebnis:
Wenn ich es mit dem Parameter -Include versuche siehts besser aus:
Seltsam...
Gruß,
Dani
erst einmal dein Skript korrigiert. In deiner Fassung ist es nämlich nicht auffähig.
[string] $strPfad = "C:\Testordner\"
[array] $aFiles = @("")
[array] $aKriterien=@("*~*.asc", "*.*_asc")
foreach ($strKey in $aKriterien) {
$aFiles = @([System.IO.Directory]::GetFiles("$strPfad", "$strKey", "AllDirectories"))
$aFiles
}
Mit Regex kommen wir an der Stelle auch nicht weiter, da die Methode get-Files dies nicht unterstützt:
Die Suchzeichenfolge für die Überprüfung der Namen von Dateien in path auf Übereinstimmungen. Dieser Parameter kann eine Kombination von gültigen literalen Pfads und Platzhalter(* und?) Zeichen enthält (siehe Hinweise), unterstützt jedoch nicht reguläre Ausdrücke.
Ich habe es alternativ mit dem CommandLet (Get-ChildItem) versucht, aber da ist es genau das selbe Ergebnis:
Get-ChildItem -Path C:\Testordner -Filter *~*.asc | ft Fullname
Get-ChildItem -Path C:\Testordner\* -Include *~*.asc, *.*_asc | ft FullName
Gruß,
Dani
Hallo zusammen,
die Tilde ist hier tatsächlich etwas speziell, da sie ein Teil eines Pfades spezifizieren kann, z.B. wechselt man ja so in das Desktopverzeichnis seines Useraccounts
Bei Verwendung von Get-Childitem in Kombination mit -Filter werden die Filtermöglichkeiten des Dateisystems genutzt deswegen kommt es hier vermutlich zu diesem Effekt. Bei Verwendung von -Include (Dani's letzte Zeile) ist das anders, hier Filtern die Erweiterungen der Powershell die Ausgabe von Get-Childitem. Es wird also quasi das Komplette Verzeichnis erst eingelesen und dann gefiltert durch -Include ausgegeben. Deswegen ist auch die Verwendung von -Include um ein vielfaches langsamer als die nativen Filterfunktionen des CMDLets mit -Filter.
Also nutze die letze Zeile von Dani mit dem zusätzlichen Parameter -recurse oder mach es für deine beiden Muster so kombiniert mit dem Dateisystemfilter
Zur Info damit es keine Missverständnisse gibt: die Zeile durchsucht auch Unterordner nach dem Muster.
Grüße Uwe
die Tilde ist hier tatsächlich etwas speziell, da sie ein Teil eines Pfades spezifizieren kann, z.B. wechselt man ja so in das Desktopverzeichnis seines Useraccounts
cd ~\Desktop
Bei Verwendung von Get-Childitem in Kombination mit -Filter werden die Filtermöglichkeiten des Dateisystems genutzt deswegen kommt es hier vermutlich zu diesem Effekt. Bei Verwendung von -Include (Dani's letzte Zeile) ist das anders, hier Filtern die Erweiterungen der Powershell die Ausgabe von Get-Childitem. Es wird also quasi das Komplette Verzeichnis erst eingelesen und dann gefiltert durch -Include ausgegeben. Deswegen ist auch die Verwendung von -Include um ein vielfaches langsamer als die nativen Filterfunktionen des CMDLets mit -Filter.
Also nutze die letze Zeile von Dani mit dem zusätzlichen Parameter -recurse oder mach es für deine beiden Muster so kombiniert mit dem Dateisystemfilter
Get-ChildItem 'C:\Testordner\*[~.]*[._]ASC' -Recurse
Grüße Uwe