Ложный 'system\cmd.exe' в циклах FOR/F

Это одно из тех требований, которые усложняются каждый раз, когда я нахожу взлом оболочки Windows/cmd, который требует «обходного решения». По сути ... мне нужно перебрать определенный список папок в цикле FOR оболочки DOS. Вот цикл, который я придумал:

 echo  ^ [start for test]
 for  /F "usebackq "  %%f IN (`dir /b /adh "w:\sandbox\tmp\"`)  DO (
    echo ^    do with file: %%f
    rem  <do something>
 )
echo  ^ [for test done]

Основная потребность заключается в переборе скрытых каталогов в исходной папке (здесь sandbox\tmp).

Результат одновременно удивляет и разочаровывает. Это результат использования инструкции FOR в командной строке консоли.

W:..> for  /F "usebackq "  %f 
              IN (`dir /b /adh "w:\sandbox\tmp\"`)  DO echo ^ folder = %f
File Not Found                                <1>
  folder = C:\WINDOWS\system32\cmd.exe        <2>
  folder = any                                <4>
  folder = hidden-folder-01                   <3>
  folder = hidden-folder-02                   <3>
  folder = morph                              <4>
  folder = practice-northwind                 <4>

В котором перечислены пять папок. Здорово! И один cmd.exe по метке: ‹2> и тайна по метке: ‹1>. Думаю, я должен объяснить переключатели DIR.

  • /b ....... Чистый формат, только имена файлов/папок.
  • /adh ..... И скрытые, и каталоги, пробовали это исчерпывающе - не сработало.
    /aHD
  • /ad ...... Элементы с атрибутом Directory (папки).
  • /ah ...... Скрытые файлы/папки (на первый взгляд).

Я обозначил вывод, и вот что у меня получилось.

  1. «Файл не найден»... .. .. .. .. .. .. Понятия не имею. Я нахожу, что «Файл не найден». ‹1> — артефакт переключателя /ah. Когда я просто говорю:
    IN (dir /b /adh "w:\sandbox\tmp\")
  2. C:\WINDOWS\system32**cmd.exe** .. .. Ложный итератор (%%f); эта ошибка появляется только с версией команды FOR /F. Я хочу найти скрытые каталоги, а список наборов файлов не возвращает скрытые файлы (черт возьми). Итак, до сих пор я застрял с usebackq версией FOR /F.
  3. Скрытые папки... .. .. .. .. .. .. Эти папки являются ожидаемымивыходными данными_.
  4. Папки каталогов. .. .. .. .. .. .. Эти файлы являются ложными результатами и не нужны.

Предполагаемый результат из версии строки CMD (или из примера сценария DOS) — это всего лишь ‹3> элемента.

W:..> for  /F "usebackq "  %f 
              IN (`dir /b /adh "w:\sandbox\tmp\"`)  DO echo ^ folder = %f
  folder = hidden-folder-01                   <3>
  folder = hidden-folder-02                   <3>

К сожалению, я также «могу» получить любой файл в целевой папке. Я думаю, что это снова связано со СКРЫТЫМ переключателем (/ah).

Как я могу перечислить только скрытые папки (не файлы) в заданном каталоге; и перебирать список, как команда FOR?

Заранее спасибо / Уилл


person will    schedule 16.01.2010    source источник


Ответы (2)


Вы должны использовать

for  /F "usebackq delims=*"  %f IN (`"dir /b /adh "%1" 2>NUL"`)  DO @echo. folder = "%f"

to do it.

2>NUL

убедитесь, что канал ошибки (например, файл не найден) не отображается и указывает на NULL (NUL)

delims=*

убедитесь, что скрипт будет работать, если в именах файлов есть пробелы, так как в именах файлов не может быть "*", мы найдем их все!

Я надеюсь, что это сработает для вас, это сработало для меня.

Я хотел бы получить обратную связь, если что-то изменится на вашей стороне, если вы не используете %f, а используете %a, у меня есть идея, почему вы получите следующую строку в вашем выводе

folder = C:\WINDOWS\system32\cmd.exe        <2>

Приветствует PCFreak

person PCFreak    schedule 28.04.2011
comment
Простите, но разве это не просто сокрытие проблемы? Сейчас я использую структуру CALL :label с циклами и т.п. Спас меня от многих головных болей, подобных этой. Увы, я просто думаю, что синтаксис CMD... - person will; 25.06.2011
comment
Извините, но я думаю, что ответ правильный. Вы можете реализовать вещи так, как вам лично нравится, например. звонок с этикетками но это не меняет вопроса! for /F "usebackq delims=*" %f IN (dir /s /b /a:dh c:\ 2›NUL) DO @echo. folder = "%f" просто работает. - person PCFreak; 26.02.2019
comment
Он работает, скрывая настоящую проблему согласованности. Две версии одной и той же указанной/задокументированной семантики дают разные ответы. Лекарство состоит в том, чтобы использовать баш или рыбу. с тех пор, как я перешел на Ubuntu, мой компьютер не зависает, и простые мемы-скрипты, подобные этому, работают. - person will; 06.03.2019

В вашем пакетном файле dir /b /a dh "w:\sandbox\tmp\" должно быть dir /b /adh "w:\sandbox\tmp\" без пробела между /a и dh. С пробелом команда dir интерпретирует dh как каталог или файловый паремер и является причиной ошибки «файл не найден».

Когда вы работаете из командной строки, вы используете другой параметр для команды dir dir /b /ah /ad "w:\sandbox\tmp\", поэтому вы получаете другой вывод. С /ah и /ad в качестве отдельных параметров dir, кажется, интерпретирует, что он должен показывать вещи, которые являются каталогами или скрытыми файлами, в то время как /adh показывает вещи, которые являются как каталогами, так и скрытыми.

Также вам не нужно иметь @ во всех ваших строках. Просто отключите @echo в верхней части файла, и это отключит эхо команды для всего пакетного файла.

person shf301    schedule 16.01.2010
comment
Привет shf301, Спасибо за ваши комментарии. Я нашел эти точки довольно рано. К сожалению, эти изменения не решают проблемы. Я убрал пробел из команды /aX. dir /ah .... не показывает скрытые файлы или папки. dir /ad .... показывает каталоги dir /adh и dir /ahd .... Не показывает абсолютно никаких файлов или каталогов. Во всех случаях в цикле FOR /F я получаю ложный файл $system/cmd.exe в списке. Мой ведущий @ преднамеренный, я обнаружил, что это помогает мне при отладке скрипта 15 лет назад. / ш. - person will; 18.01.2010