5

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

Описание ошибки:

  Команда for интерпретатора команд не может видеть скрытые файлы.

Шаги воспроизведения:

  1. Создать временный каталог
  2. Создайте несколько файлов
  3. Присвойте файлы различным атрибутам (включая скрытые)
  4. Используйте команду как for %i in (*) do echo "%i"

Ожидаемые результаты:

   Все файлы обрабатываются в цикле for по умолчанию или через переключатель.

Фактические результаты:

  • Файлы с любым атрибутом, кроме скрытого, обрабатываются; файлы помеченные как скрытые пропускаются
  • В команде for нет переключателя, позволяющего обрабатывать скрытые файлы

Последствия:

   Нет способа обработать все файлы из командной строки.

Вопрос:

   Как, черт возьми, можно обрабатывать скрытые файлы из командной строки или пакетных файлов (по крайней мере, в Windows, если не в DOS)?

2 ответа2

4

Вот один (некрасивый, неприятный, неидеальный) обходной путь для файлов:

for /f "tokens=* delims=" %i in ('dir /b/a-d *') do echo "%i"

И версия для папок (аналог for /d…):

for /f "tokens=* delims=" %i in ('dir /b/ad  *') do echo "%i"

И версия для обоих (нет for аналога, так что это что-то из выгоды):

for /f "tokens=* delims=" %i in ('dir /b/a   *') do echo "%i"


Рекурсивная версия для файлов (for… /r):

for /f "tokens=* delims=" %i in ('dir /b/s/a-d *') do echo "%i"

И папки (for /r /d…):

for /f "tokens=* delims=" %i in ('dir /b/s/ad  *') do echo "%i"

И оба

for /f "tokens=* delims=" %i in ('dir /b/s/a   *') do echo "%i"



Это работает более или менее, но определенно имеет свои проблемы (особенно для больших наборов файлов или папок). Надеемся, что есть лучшее решение или Microsoft может исправить / улучшить это в патче.

4

Вы можете использовать forfiles вместо for .

Синтаксис совершенно другой, но он имеет больше функциональных возможностей (например, метод прямого доступа к имени файла, расширению, размеру файла и метке времени) и обрабатывает все файлы по умолчанию.

Например, вместо

for %i in (*) do echo "%i"

вы бы использовали

forfiles /c "cmd /c echo @file"

или просто

forfiles

поскольку "cmd /c echo @file" является значением по умолчанию для переключателя команд.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .