Файлы с длинными расширениями неожиданно удаляются с помощью командной строки - PullRequest
3 голосов
/ 09 июля 2009

Я пытаюсь удалить некоторые файлы, используя командный файл .. (winxp)

Моя проблема заключается в том, что при удалении с использованием подстановочного знака оно совпадает с именем 8.3 и длинным именем.

например: список файлов

file1.py
file1.pyc
file2.pycstlongname
file2.pycstlongnamec

если я сделаю

Del *.pyc

удаляет все, кроме file1.py

, потому что, если я сделаю dir / X, все 8.3 короткие имена заканчиваются на .PYC

Ответы [ 2 ]

4 голосов
/ 10 июля 2009

Ну, в вашем случае вы, вероятно, можете использовать 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 вскоре должны погибнуть ужасной смертью. Или, по крайней мере, я надеюсь, что они делают.

4 голосов
/ 09 июля 2009

Когда вы выполняете управление файлами с помощью подстановочные знаки из командной строки, файлы с длинными расширениями могут быть неожиданно отображается, копируется или Исключен.

Вы правы, это происходит и на моем компьютере под управлением полностью исправленной Windows XP SP3.

См. Следующую статью базы знаний Майкрософт для получения дополнительной информации и изменения реестра, которое решит эту проблему. Этот путь полностью восходит к Windows NT 4.0:

Номер статьи: 164351 - Последний обзор: 1 ноября 2006 - Редакция: 1.1
Обработка командной строки длинных расширений файлов

http://support.microsoft.com/kb/164351

ОБНОВЛЕНИЕ: Такое поведение также происходит в тестовом приложении C #, которое я написал. Поведение достаточно тревожное, что я применил исправление реестра к своему компьютеру, и оно работает.

...