pegasus37
Goto Top

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?

Content-Key: 117967

Url: https://administrator.de/contentid/117967

Printed on: April 19, 2024 at 05:04 o'clock

Member: mexx
mexx Jun 11, 2009 at 08:26:38 (UTC)
Goto Top
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.
Member: Biber
Biber Jun 11, 2009 at 09:46:48 (UTC)
Goto Top
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:
>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
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
Member: mexx
mexx Jun 11, 2009 at 09:53:18 (UTC)
Goto Top
Mensch Biber, kurzfristig trifft es, aber einfach is des net. Ich ziehe den Hut. Kann mit der eile gar nix anfangen. Setzt Du eine Variable mit Funktionsaufruf?
Member: bastla
bastla Jun 11, 2009 at 09:59:41 (UTC)
Goto Top
@mexx
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
- nur ein klein wenig kompakter ... face-wink

Grüße
bastla
Member: paulepank
paulepank Jun 11, 2009 at 10:01:35 (UTC)
Goto Top
Hallo hier,

oder ein anderer Weg nach Rom
dir /b 31*.* | findstr "31......\..*"  

Einschränkung:es muß eine Dateierweiterung geben.

cu paulepank
Member: bastla
bastla Jun 11, 2009 at 10:05:57 (UTC)
Goto Top
... und Einschränkung 2: Es sollte keinen Dateinamen geben, der an der 9. Stelle einen Punkt hat.

Grüße
bastla
Member: paulepank
paulepank Jun 11, 2009 at 10:15:47 (UTC)
Goto Top
ja das ist mir eben auch aufgefallen face-sad
Member: Pegasus37
Pegasus37 Jun 11, 2009 at 16:14:50 (UTC)
Goto Top
An alle vielen Dank für die umfangreichen Workarounds.
Da meine Dateinamen ausschließlich aus Ziffern bestehen, ist mir mit der Längenabfrage des Namens schon sehr geholfen.
Nochmals vielen Dank.