Ложный 'system \ cmd.exe' в циклах FOR / F - PullRequest
1 голос
/ 16 января 2010

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

 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]

Основная задача - перебирать скрытые каталоги в исходной папке (здесь песочница \ 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 на ярлыке: <<strong> 2 > и загадка на ярлыке: <<strong> 1 >. Я должен объяснить переключатели DIR , я думаю.

  • / b ....... Голый формат, только имена файлов / папок.
  • / a dh ..... И скрытые, и каталоги, пытались это исчерпывающе - не сработало.
    / a hd
  • / a d ...... Элементы с атрибутом Directory (папки).
  • / a h ...... Скрытые файлы / папки (вроде бы).

Я пометил вывод, и вот что я уже разработал.

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

Ответы [ 2 ]

2 голосов
/ 16 января 2010

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

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

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

1 голос
/ 28 апреля 2011

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

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

чтобы сделать это.

2>NUL

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

delims=*

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

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

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

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

Greets PCFreak

...