Войти

Показать полную графическую версию : [решено] Нужен батник для сканирования папок и записи результатов в файл


Nun-Nun
17-09-2010, 13:33
Есть набор папок, в каждой из которых расположен один файлик (чаще всего exe-шник). Нужно, с помощью батника просканировать эти папки и результаты получить в виде текстового файла или батника с таким содержимым:

;Название папки 1
"исполняемая команда" "Название папки 1"\"название файла в папке 1" "параметры"
;Название папки 2
"исполняемая команда" "Название папки 2"\"название файла в папке 2" "параметры"

...

;Название папки N
"исполняемая команда" "Название папки N"\"название файла в папке N" "параметры"

P.S. Папки и файлы в приведённом шаблоне на самом деле порядковых номеров не имеют, а имеют различные названия. Их нумерация приведена только для наглядности.

El Sanchez
20-09-2010, 17:56
Nun-Nun, мало вводных данных, поэтому:

@Echo Off
Set Source=C:\Source
Set ExecutableFile=исполняемый файл
Set Params=параметры

For /F "Tokens=*" %%A In ('Dir /B /AD "%Source%"') Do (
For /F "Tokens=*" %%B In ('Dir /B "%Source%\%%A\*.exe" 2^>nul') Do (
Echo ;%%A>>list.log
Echo "%ExecutableFile%" "%%A\%%B" %Params%>>list.log
)
)

Nun-Nun
21-09-2010, 14:54
Немного переделал скрипт (убрал кавычки и привязку к конкретной папке), теперь почти то, что надо. Поправьте, если я не прав.
@Echo Off
rem Set Source=C:\Source
Set ExecutableFile=start /wait .\
Set Params=/Q /O /N /Z

For /F "Tokens=*" %%A In ('Dir /B /AD') Do (
For /F "Tokens=*" %%B In ('Dir /B %%A\*.exe 2^>nul') Do (
Echo ;%%A>>list.cmd
Echo %ExecutableFile%%%A\%%B %Params%>>list.cmd
)
)
Echo.
Echo Названия папок и файлов скопированы в файл list.cmd
Echo.
Pause

Есть несколько пожеланий по поводу скрипта:
1) можно ли сделать, чтобы итоговый файл list.cmd сохранялся с русской кодировкой 866 ?
2) не могли бы Вы в скрипте прописать не только exe-файлы, но и msi-файлы? а то иногда, кроме exe-шников и msi попадаются.

P.S. Для большей информативности вводных данных:
1) глубина вложенности папок может быть более одного уровня;
2) исполняемая команда exe-файлов выглядит так: start /wait .\
3) параметры для exe-файлов выглядят так: /Q /O /N /Z
Командная строка для msi-файлов выглядит несколько иначе: "исполняемая команда" "Название папки" "параметры"
4) исполняемая команда выглядит так: start /D.\
5) параметры выглядят так: /wait MSIEXEC /I "имя msi-файла" ALLUSERS=TRUE REBOOT=SUPPRESS /QN

El Sanchez
21-09-2010, 17:18
можно ли сделать, чтобы итоговый файл list.cmd сохранялся с русской кодировкой 866 ? »
Nun-Nun, я взял за основу 2 правила, которых придерживаюсь по-умолчанию: 1) сохранять сценарии CMD/BAT в кодировке DOS (OEM866), даже если она там не требуется; 2) любые пути заключать в двойные кавычки, даже если они там не требуются.

@Echo Off
Set ParamsExe=/Q /O /N /Z
Set ParamsMsi=ALLUSERS=TRUE REBOOT=SUPPRESS /QN

Del /F /Q list.cmd 1>nul 2>&1
For /F "Tokens=*" %%A In ('Dir /S /B /AD') Do (
For /F "Tokens=*" %%B In ('Dir /B "%%A\*.exe" "%%A\*.msi"') Do (
Echo ::%%~nA>>list.cmd
If /I "%%~xB"==".exe" (Echo Start /Wait "" "%%A\%%B" %ParamsExe%>>list.cmd)
If /I "%%~xB"==".msi" (Echo Start /Wait "" MsiExec /I "%%A\%%B" %ParamsMsi%>>list.cmd)
)
)

Nun-Nun
21-09-2010, 20:46
я взял за основу 2 правила, которых придерживаюсь по-умолчанию: 1) сохранять сценарии CMD/BAT в кодировке DOS (OEM866), даже если она там не требуется; 2) любые пути заключать в двойные кавычки, даже если они там не требуются.
Код: »
Ну что ж, очень разумно, возьму тоже на заметку.
Иду пробовать скрипт.

Nun-Nun
21-09-2010, 22:58
El Sanchez,

Есть ещё одна просьба: поскольку на основе работы скрипта создаётся bat-файл, в начале и конце бывает необходимо какое-нибудь сообщение. Например, перед началом выполнения скрипта выдаётся текст шапки батника и что-нибудь типа "Идёт считывание и запись имён папок и файлов"), а в конце - что-нибудь типа "Процесс завершён, результат находится в файле List.bat". Можно ли соответствующие поля для текста добавить в скрипт?

El Sanchez
22-09-2010, 13:54
Nun-Nun, можно сделать как вы хотите (выделено красным), либо выводить данные сообщения в консоль (выделено зеленым)

@Echo Off
Set ParamsExe=/Q /O /N /Z
Set ParamsMsi=ALLUSERS=TRUE REBOOT=SUPPRESS /QN

Title Идёт считывание и запись имён папок и файлов
Echo Идёт считывание и запись имён папок и файлов...
Del /F /Q list.cmd 1>nul 2>&1
For /F "Tokens=*" %%A In ('Dir /S /B /AD') Do (
For /F "Tokens=*" %%B In ('Dir /B "%%A\*.exe" "%%A\*.msi"') Do (
Echo ::%%~nA>>list.cmd
If /I "%%~xB"==".exe" (Echo Start /Wait "" "%%A\%%B" %ParamsExe%>>list.cmd)
If /I "%%~xB"==".msi" (Echo Start /Wait "" MsiExec /I "%%A\%%B" %ParamsMsi%>>list.cmd)
)
)
Title Процесс завершён, результат находится в файле List.cmd
Echo Процесс завершён, результат находится в файле List.cmd

Nun-Nun
22-09-2010, 15:23
El Sanchez,

Благодарю!
Всё работает.




© OSzone.net 2001-2012