Ну, в вашем случае вы, вероятно, можете использовать forfiles
:
> forfiles /m *.pyc
"file1.pyc"
не соответствует правилам расширения подстановочных знаков cmd.
Вы также можете перечислить все файлы и отфильтровать их по расширению:
> for %i in (*) do @if %~xi==.pyc @echo %i
file1.pyc
Оба метода пропускают файлы, в которых совпадает только часть расширения .3
Так что вы можете использовать либо
forfiles /m *.pyc /c del @FILE
или
for %i in (*) do @if %~xi==.pyc @del "%i"
Правда, немного сложнее, чем простой del *.pyc
.
ETA: Поскольку кто-то скептически относился к тому, сработает ли это, небольшой фрагмент сеанса cmd на виртуальной машине Win XP SP 2:
S:\Temp>for %i in (file1.py,file1.pyc,file2.pycstlongname,file2.pycstlongnamec) do @copy nul %i
1 Datei(en) kopiert.
1 Datei(en) kopiert.
1 Datei(en) kopiert.
1 Datei(en) kopiert.
S:\Temp>dir /b
file1.py
file1.pyc
file2.pycstlongname
file2.pycstlongnamec
S:\Temp>del *.pyc
S:\Temp>dir /b
file1.py
S:\Temp>del *
S:\Temp>for %i in (file1.py,file1.pyc,file2.pycstlongname,file2.pycstlongnamec) do @copy nul %i
1 Datei(en) kopiert.
1 Datei(en) kopiert.
1 Datei(en) kopiert.
1 Datei(en) kopiert.
S:\Temp>for %i in (*) do @if %~xi==.pyc @del "%i"
S:\Temp>dir /b
file1.py
file2.pycstlongname
file2.pycstlongnamec
Не обращайте внимания на немецкие сообщения, я надеюсь, что это показывает, что вышеупомянутый метод действительно работает.
Чтобы немного объяснить, почему это работает, мы можем взглянуть на команду:
for %i in (*) do @if %~xi==.pyc @del "%i"
Первая часть тривиальна. for %i in (*)
просто перечисляет все файлы в текущем каталоге. Затем мы проверяем расширение; %~xi
расширяется до полного расширения (не 8.3), поэтому выполнение над строкой вызовет выполнение следующих команд:
if .py == .pyc del "file1.py"
if .pyc == .pyc del "file1.pyc"
if .pycstlongname == .pyc del "file2.pycstlongname"
if .pycstlongnamec == .pyc del "file2.pycstlongnamec"
Надеюсь, очевидно, почему это работает лучше, чем глобализация, выполняемая cmd, которая включает в себя 8.3 имен. Здесь нет подстановочных знаков, нечего делать неправильно.
Вариант forfiles
работает на моих машинах с Win 7 и Vista здесь. Я могу только догадываться, но я сильно подозреваю, что forfiles не реализует те же правила сопоставления с подстановочными знаками, что и cmd. Поскольку мы находимся в Windows, каждая программа расширяет подстановочные знаки для себя. Это не выполняется оболочкой, в отличие от систем UNIX. То, как именно программы это делают, иногда отличается, и, видимо, и здесь тоже.
Само собой разумеется, что я считаю подход forfiles
здесь более разумным, так как имена 8.3 вскоре должны погибнуть ужасной смертью. Или, по крайней мере, я надеюсь, что они делают.