Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Нужен батник для сканирования папок и записи результатов в файл (http://forum.oszone.net/showthread.php?t=185727)

Nun-Nun 17-09-2010 13:33 1497677

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

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

...

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

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

El Sanchez 20-09-2010 17:56 1500014

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 1500761

Немного переделал скрипт (убрал кавычки и привязку к конкретной папке), теперь почти то, что надо. Поправьте, если я не прав.
Код:

@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 1500889

Цитата:

Цитата Nun-Nun
можно ли сделать, чтобы итоговый файл 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 1501042

Цитата:

Цитата El Sanchez
я взял за основу 2 правила, которых придерживаюсь по-умолчанию: 1) сохранять сценарии CMD/BAT в кодировке DOS (OEM866), даже если она там не требуется; 2) любые пути заключать в двойные кавычки, даже если они там не требуются.
Код: »

Ну что ж, очень разумно, возьму тоже на заметку.
Иду пробовать скрипт.

Nun-Nun 21-09-2010 22:58 1501161

El Sanchez,

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

El Sanchez 22-09-2010 13:54 1501632

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 1501715

El Sanchez,

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


Время: 22:27.

Время: 22:27.
© OSzone.net 2001-