Anscheinend berücksichtigt die Shell sowohl den kurzen als auch den langen Namen für die Erweiterung von Platzhaltern. Eine ausführlichere Erklärung finden Sie in der Antwort von shf301 . Dies ist bedauerlich und wahrscheinlich ein Überbleibsel von Ye Olde Days of DOS, weil damit cmd
versucht wird, irgendwie kompatibel zu sein.
Mehrere Optionen hier:
Verwenden Sie
forfiles
eine andere Semantik für die Wildcard-Erweiterung:forfiles /m *.txt /c "cmd /c copy @file foo"
Dies ist mindestens unter Vista und höher verfügbar.
Verwenden
for
und überprüfen Sie die Erweiterung:for %a in (*.txt) do @if %~xa==.txt @copy "%i" foo
Gibt leider
for
auch Dateien mit der.txt~
Erweiterung zurück, wenn nur die Erweiterung mit Platzhaltern verwendet wird. Deshalb müssen wir die Erweiterung ein zweites Mal überprüfen.Verwenden
xcopy
. Währendxcopy
für die Platzhaltererweiterung die gleiche Semantik wie für die Shell gilt, können Sie ihr eine Datei mit zu ignorierenden Namen zuweisen:echo .txt~>tmpfile xcopy *.txt foo /exclude:tmpfile del tmpfile
Verwenden
robocopy
. Währendrobocopy
für die Platzhaltererweiterung die gleiche Semantik wie für die Shell gilt, können Sie ihr eine Liste von zu ignorierenden Dateien / Platzhaltern zuweisen:robocopy . foo *.txt /XF *.txt~
Verwenden
for
,dir
undfindstr
in einer geeigneten Kombination. Dies filtert im Wesentlichen nur alle Zeilen heraus, die~
am Ende ein und das übrige funktionieren. Dieif
Variante oben war eleganter, finde ich.for /f "usebackq delims=" %i in (`dir /b *.txt ^| findstr /r "[^~]$"`) do @copy "%i" foo
Nur zur Vollständigkeit: PowerShell:
Copy-Item *.txt foo