Platzhalter bzw. Wildcards in cmd von WindowsXP und Server 2003
Guten Morgen!
Ich habe ein Problem beim Einsetzen von Platzhaltern unter Windows.
Ich muß aus einem Verzeichnis in einer Batch-Datei alle Dateien ausfiltern, deren Dateiname mit 31 beginnt und genau 8 Zeichen (ohne Extension) lang ist. Eigentlich wäre das ja kein Problem, da das ? als Wildcard für genau ein beliebiges Zeichen stehen soll. Für einen Dateinamen bis zu 7 Zeichen stimmt das auch, allerdings nicht mehr bei 8 Zeichen. Der Filter 31??????.* findet alles, was mindestens 8 Zeichen lang ist und mit 31 beginnt, also auch längere Dateinamen.
Wie kann ich das Problem umgehen bzw. lösen?
Ich habe ein Problem beim Einsetzen von Platzhaltern unter Windows.
Ich muß aus einem Verzeichnis in einer Batch-Datei alle Dateien ausfiltern, deren Dateiname mit 31 beginnt und genau 8 Zeichen (ohne Extension) lang ist. Eigentlich wäre das ja kein Problem, da das ? als Wildcard für genau ein beliebiges Zeichen stehen soll. Für einen Dateinamen bis zu 7 Zeichen stimmt das auch, allerdings nicht mehr bei 8 Zeichen. Der Filter 31??????.* findet alles, was mindestens 8 Zeichen lang ist und mit 31 beginnt, also auch längere Dateinamen.
Wie kann ich das Problem umgehen bzw. lösen?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 117967
Url: https://administrator.de/contentid/117967
Ausgedruckt am: 25.11.2024 um 04:11 Uhr
8 Kommentare
Neuester Kommentar
Ja das Problem kenne ich. Die Wildcardsuche über diese veraltete Shell ist dahingehend nicht clever gemacht. Der Befehl dir 31??????.* findet auch alle 31?, 31??, 31??? und so weiter. Leider ist as so gewollt. Aber ich kann Dir nur dringend empfehlen, Dich mit Powershell auseinander zu setzten. Betrachte Powershell als weiterentwicklung der cmd. Mit den Befehl Get-ChildItem c:\*.* -include 11??????.* erreichst Du Dein Ziel.
Moin Pegasus37,
falls aber die Zeit drängt und ein kurzfristiger Workaround über die CMD.exe vertretbar sein sollte:
- dann vergiss an dieser Stelle die Filterung über DIR plus ?-Wildcards.
Denn "?" steht NICHT für "genau 1 beliebiges Zeichen", sondern auch für "ein oder kein Zeichen", es sei denn die gesamte Wildcard besteht aus genau einem Fragezeichen *gg
Demo:
ABER:
Wenn Du nun alle Dateien mit GENAU 8 Zeichen brauchst:
[wieder Beispiel am CMD-Prompt /erste Zeile ist Eingabe/Rest Ausgabe]
Anmerkung: Bei mir ist "DelayedExpansion IMMER gesetzt via Registry. Das "SET EnableDelayedExpansion & " ist bei mir also nicht nötig - aber bei M$-Werkseinstellung.
Dann geht es so.
Grüße
Biber
falls aber die Zeit drängt und ein kurzfristiger Workaround über die CMD.exe vertretbar sein sollte:
- dann vergiss an dieser Stelle die Filterung über DIR plus ?-Wildcards.
Denn "?" steht NICHT für "genau 1 beliebiges Zeichen", sondern auch für "ein oder kein Zeichen", es sei denn die gesamte Wildcard besteht aus genau einem Fragezeichen *gg
Demo:
>dir /b ?.txt
x.txt
[okay, so soll es sein]
(=11:41:50 D:\temp=)
>dir /b ??.txt
dd.txt
in.txt
js.txt
pc.txt
sg.txt
x.txt --------> die Datei hat aber keine 2 Zeichen, sondern "bis zu 2 Zeichen, 2 Zeichen maximal"!
ABER:
Wenn Du nun alle Dateien mit GENAU 8 Zeichen brauchst:
[wieder Beispiel am CMD-Prompt /erste Zeile ist Eingabe/Rest Ausgabe]
>set enableDelayedExpansion & for %i in (*.*) do @set "n=%~ni" & if "!n:~7!" NEQ "" if "!n:~8!"=="" @echo %i
alltest9.txt
Beispiel.asc
Beispiel.txt
Datetest.bat
datetest.js
Decrypt1.vbs
Decrypt2.vbs
dir2test.txt
eags_usr.ini
echotest.bat
ergebnis.csv
errlev10.cmd
FindRepl.exe
FindRepl.ini
forltest.bat
ipconfig.txt
mfgbiber.txt
Dann geht es so.
Grüße
Biber
@mexx
Eigentlich macht Biber das etwa so:
- nur ein klein wenig kompakter ...
Grüße
bastla
Eigentlich macht Biber das etwa so:
@echo off & setlocal
for %%i in (31*.*) do call :ProcessFile "%%i"
goto :eof
:ProcessFile
set "Name=%~n1"
if "%Name:~8%" neq "" goto :eof
if "%Name:~7%"=="" goto :eof
echo Der Name von %1 ist genau 8 Zeichen lang.
goto :eof
Grüße
bastla