Ответы:
dir /x
Из соображений совместимости Windows генерирует имя 8.3 для каждого созданного полного имени файла, а код сопоставления с подстановочными знаками ( FindFirstFile()
) проверяет как исходные, так и сокращенные имена. Используйте, dir /x
чтобы увидеть, какие короткие имена присваиваются каждому файлу.
Часть «расширение» из 8.3 названия всегда создаются просто усечение последнего расширения не более чем 3 -х символов: .aspx
в.ASP
При использовании файловой системы NTFS создание имени 8.3 можно отключить в масштабе всей системы, используя:
fsutil behavior set disable8dot3
Однако это не повлияет на существующие имена. Вам нужно будет переименовать каждый файл, а затем переименовать его обратно в исходное имя.
Смотрите также: Поиск по каталогу в командной строке Windows показывает неправильный вывод!
dir
вывод с помощью dir /b/s *.asp | findstr /ile .asp
- это отбрасывает строки, которые не заканчиваются .asp
.
fsutil 8dot3name strip directory
для удаления существующих имен, нет необходимости переименовывать их
Конечно, это зависит от того, какую команду интерпретатора DIR
команд вы используете. DIR
Команда в Take Command , например, соответствует только длинные имена по умолчанию и поэтому не проявляет такого поведения. ( Соответствие как коротких, так и длинных имен может быть включено для совместимости с DIR
командой CMD .) Таким образом, существуют способы решения этой проблемы, которые не требуют FSUTIL
привилегий администратора.
Интересно - похоже, ошибка ...
Учитывая, я бы нашел это так:
dir /s *.asp | find /i /v ".aspx "
.aspx
где-то посередине их имен, например file.aspx.name.asp
, которые на самом деле должны быть включены ...
Если у вас есть PowerShell , вы можете использовать:
dir *.asp -r | remove-item
Если у вас нет PowerShell, почему бы и нет?
Как пользователь grawity уже сказал в своем ответе , это происходит потому , что специальные символы , используемые cmd
«s внутренних команд и несколько внешних них также сопоставляют 8.3 имен файлов , которые включены по умолчанию.
Чтобы обойти это, есть несколько способов, некоторые из которых я хочу показать вам:
Вы можете использовать findstr
для фильтрации имен файлов, возвращаемых dir
:
dir /S /B /A:-D "*.asp" | findstr /IEC:".asp"
Это даже не соответствует файлам, которые имеют .asp
где-то в своих именах (например file.asp.aspx
), и не исключает файлы, которые имеют .aspx
в своих именах (например file.aspx.asp
).
Переключатель /B
позволяет dir
возвращать чистый список имен файлов / путей, которые можно правильно отфильтровать. Опция /A:-D
исключает любые соответствующие каталоги.
В качестве альтернативы можно использовать where
команду , которая обрабатывает символы подстановки иначе, чем dir
:
where /R "." "*.asp"
Недостатком является то, что эта команда также относится к содержимому PATHEXT
переменной, поэтому она также будет соответствовать файлу, который заканчивается в .asp.exe
, если .EXE
он содержится в PATHEXT
; чтобы избежать этого, вы можете временно очистить PATHEXT
переменную (по set "PATHEXT_BACKUP=%PATHEXT%" & set "PATHEXT="
) и восстановить ее позже (по set "PATHEXT=%PATHEXT_BACKUP%" & set "PATHEXT_BACKUP="
).
Этот ответ пользователя Konrad показывает способ изменить поведение по умолчанию при создании имен файлов 8.3 для элементов с расширением более 3 символов, что, в свою очередь, предотвращает большинство таких непреднамеренных совпадений. Но, к сожалению, это не меняет текущие имена файлов 8.3. И, конечно, теоретически могут быть ситуации, когда имена файлов 8.3 все еще совпадают, хотя и маловероятно.
Я должен признать, что я еще не проверял это ...