Рекурсия пакетного файла для диапазона букв, избегая странных выборов коротких имен - PullRequest
1 голос
/ 20 апреля 2020

Мой код

for %f in (c:\mPodcasts\ipod\s*.lnk c:\mPodcasts\ipod\ta*.lnk c:\mPodcasts\ipod\te*.lnk c:\mPodcasts\ipod\tha*.lnk) do echo %f

неожиданно получает несколько файлов коротких имен (например, шоу Джона Батчелора - xyz, THA1ED ~ 1.lnk).

это обсуждается здесь: Странное Windows Поведение команды DIR

Я бы предпочел НЕ отключать короткие имена в целом. Я пытался создать файл .txt для списков каталогов, но dir * | findstr / r ^ tha, кажется, игнорирует каретку и находит любое имя файла, содержащее tha.

Я открыт для других решений, которые будут давать мне результаты только на основе длинных имен файлов.

Ваши мысли?

Thx

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Не имея возможности проверить, я считаю, что при использовании команды where, (Windows Vista и далее) , следует игнорировать эти 8.3 имен файлов:

@For /F "EOL=| Delims=" %%G In ('%__AppDir__%where.exe^
     C:\mPodcasts\ipod:s*.lnk^
     C:\mPodcasts\ipod:ta*.lnk^
     C:\mPodcasts\ipod:te*.lnk^
     C:\mPodcasts\ipod:tha*.lnk^
     2^>NUL') Do @Echo %%G
@Pause

Для В целях вашей предоставленной информации, вышеперечисленное должно работать без изменений. Однако, если ваши каталоги или шаблон файла содержат пробелы, содержащие не более 1027 * символов, вы также можете заключить их в двойные кавычки при необходимости:

@For /F "EOL=| Delims=" %%G In ('%__AppDir__%where.exe^
     "C:\mPodcasts\ipod":"s*.lnk"^
     "C:\mPodcasts\ipod":"ta*.lnk"^
     "C:\mPodcasts\ipod":"te*.lnk"^
     "C:\mPodcasts\ipod":"tha*.lnk"^
     2^>NUL') Do @Echo %%G
@Pause

Надеюсь, это поможет.

Кстати, это решение также решает другую проблему, упомянутую в вопрос, который вы связали в своем посте выше. Команда where не выводит расширения «начинающиеся с», она соответствует им правильно. Взяв за основу связанный вопрос «обсуждения», *.htm соответствует только .htm расширениям, (не включает .html) , а *.man не соответствует .manifest расширениям.

Если вы хотите sh протестировать вывод непосредственно в окне cmd.exe, то вот однострочная версия:

For /F "EOL=| Delims=" %G In ('%__AppDir__%where.exe C:\mPodcasts\ipod:s*.lnk C:\mPodcasts\ipod:ta*.lnk C:\mPodcasts\ipod:te*.lnk C:\mPodcasts\ipod:tha*.lnk 2^>NUL') Do @Echo %G
2 голосов
/ 20 апреля 2020

Я предлагаю использовать в командном файле:

@echo off
pushd "C:\mPodcasts\ipod"
for /F "eol=| delims=" %%I in ('dir s*.lnk ta*.lnk te*.lnk tha*.lnk /A-D /B 2^>nul ^| %SystemRoot%\System32\findstr.exe /B /I /L "s ta te tha"') do echo %%I
popd

DIR выводит длинные имена файлов тех файлов, с которыми одно из длинных или коротких имен совпадает с одним из шаблоны подстановочных знаков.

FINDSTR запускает поиск без учета регистра букв , который выводит только те строки (длинные имена файлов) начиная с при любом s или ta или te или tha. Символ пробела интерпретируется FINDSTR как оператор ИЛИ, за исключением того, что /C: ставится слева от строки поиска (и несколько /C: используются для поиска строк, по которым совпадает одна из указанных строк поиска).

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки , выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • dir /?
  • echo /?
  • findstr /?
  • for /?
  • popd /?
  • pushd /?
...