WinXP dir-Befehl: 3 und 4 Zeichenerweiterungen sind gleich?

1145
chris

Ich versuche eine Verzeichnisstruktur rekursiv zu durchsuchen, um alle .aspDateien mit dem folgenden Befehl zu finden:

dir *.asp /s 

Aus irgendeinem Grund werden nicht nur die ASP-Dateien, sondern auch die ASPX-Dateien zurückgegeben.

Wie kann ich erzwingen, dass die ASPX-Dateien ignoriert werden?

3

5 Antworten auf die Frage

5
grawity
dir /x 

Aus Kompatibilitätsgründen generiert Windows für jeden erstellten langen Dateinamen einen 8.3-Namen, und der Wildcard-Übereinstimmungscode ( FindFirstFile()) überprüft sowohl den ursprünglichen als auch den verkürzten Namen. Zeigt dir /xan, welche Kurznamen jeder Datei zugewiesen werden.

Der "extension" -Teil eines 8.3-Namens wird immer erstellt, indem die letzte Erweiterung einfach auf höchstens 3 Zeichen gekürzt wird: .aspxbis.ASP


Wenn das NTFS - Dateisystem verwenden, 8.3 Namen Erstellung kann deaktiviert werden systemweit mit:

fsutil behavior set disable8dot3 

Dies wirkt sich jedoch nicht auf vorhandene Namen aus. Sie müssen jede Datei umbenennen und sie dann wieder in ihren ursprünglichen Namen umbenennen.


Siehe auch: Verzeichnissuche in der Windows-Eingabeaufforderung zeigt eine falsche Ausgabe an!

Nun, das ist eine ziemlich gute Erklärung für den Grund - aber es scheint, als gäbe es keine Möglichkeit, den Befehl dir zu zwingen, die ASPX-Dateien zu ignorieren. chris vor 13 Jahren 0
@chris: Nein. Aber Sie können entweder die 8.3-Namen von Ihrem System _ entfernen (was Ihnen später wahrscheinlich eine Menge Ärger erspart), oder die `dir'-Ausgabe mit` dir / b / s * .asp | filtern findstr / ile .asp` - verwirft Zeilen, die nicht mit `.asp` enden. grawity vor 13 Jahren 1
Gemäß [dieser Antwort] (https://superuser.com/a/370306/241386) können Sie das `fsutil 8dot3name strip-Verzeichnis 'verwenden, um die vorhandenen Namen zu entfernen. Sie müssen nicht umbenannt werden phuclv vor 7 Jahren 0
[Warum findet FindFirstFile kurze Namen?] (Https://blogs.msdn.microsoft.com/oldnewthing/20050720-16/?p=34883) phuclv vor 7 Jahren 0
0
Multiverse IT

Interessant - scheint ein Fehler zu sein ...

In Anbetracht dessen würde ich es wie folgt durchgehen:

dir /s *.asp | find /i /v ".aspx " 
Es ist kein Fehler, wie in der Antwort von Grawity. Aber warum hinterlässt du am Ende von aspx ein Leerzeichen? phuclv vor 7 Jahren 0
@phuclv, der nachfolgende _space_ muss entfernt werden, da er sonst Teil der Suchzeichenfolge ist; Auf jeden Fall würde dieser Ansatz auch Dateien ausschließen, die `.aspx` irgendwo in der Mitte ihres Namens haben, wie` file.aspx.name.asp`, die eigentlich enthalten sein sollten ... aschipfl vor 5 Jahren 1
0
JdeBP

Dies hängt natürlich davon ab, welchen Befehl ein Interpreter DIRverwendet. Der DIRBefehl in Take Command zum Beispiel stimmt standardmäßig nur mit langen Namen überein und zeigt dieses Verhalten nicht. (Das Abgleichen von kurzen und langen Namen kann aus Kompatibilitätsgründen mit dem DIRBefehl von CMD aktiviert werden.) Es gibt also Möglichkeiten, dies zu beheben, ohne dass FSUTILAdministratorrechte erforderlich sind .

0
Peter Hahndorf

Wenn Sie PowerShell verwenden, können Sie Folgendes verwenden:

dir *.asp -r | remove-item 

Wenn Sie keine PowerShell haben, warum nicht?

0
aschipfl

Wie der Benutzer grawity in seiner Antwort bereits sagte, liegt dies daran, dass die Platzhalter, die von cmdden internen und mehreren externen Befehlen verwendet werden, auch mit 8.3-Dateinamen übereinstimmen, die standardmäßig aktiviert sind.

Um dies zu umgehen, gibt es mehrere Möglichkeiten, von denen ich Ihnen einige zeigen möchte:


Sie können verwenden findstr, um die zurückgegebenen Dateinamen zu filtern dir:

dir /S /B /A:-D "*.asp" | findstr /IEC:".asp" 

Dies stimmt nicht einmal mit Dateien überein, die .aspirgendwo im Namen (wie file.asp.aspx) stehen, und schließt auch Dateien mit .aspxNamen (wie file.aspx.asp) nicht aus.

Der Schalter /Bermöglicht direine reine Liste von Dateinamen zurückgeben / Pfaden, die richtig gefiltert werden können. Die Option /A:-Dschließt alle übereinstimmenden Verzeichnisse aus.


Alternativ kann der whereBefehl verwendet werden, der Platzhalter anders behandelt als dir:

where /R "." "*.asp" 

Der Nachteil ist, dass dieser Befehl auch den Inhalt der PATHEXTVariablen berücksichtigt, sodass dies auch zu einer Datei passen würde, die auf endet .asp.exe, sofern sie .EXEenthalten ist PATHEXT; Um dies zu vermeiden, können Sie die PATHEXTVariable vorübergehend löschen (by set "PATHEXT_BACKUP=%PATHEXT%" & set "PATHEXT=") und sie später (by set "PATHEXT=%PATHEXT_BACKUP%" & set "PATHEXT_BACKUP=") wiederherstellen .


Diese Antwort von Benutzer Konrad zeigt eine Möglichkeit, das Standardverhalten der Erstellung von 8.3-Dateinamen von Elementen mit einer Erweiterung mit mehr als 3 Zeichen zu ändern, wodurch die meisten solcher unbeabsichtigten Übereinstimmungen verhindert werden. Dies ändert jedoch leider keine aktuellen 8.3-Dateinamen. Natürlich könnte es theoretisch Situationen geben, in denen die 8.3-Dateinamen noch übereinstimmen, obwohl dies sehr unwahrscheinlich ist.

Ich muss zugeben, dass ich das noch nicht getestet habe ...