Задача: подтверждение идентичности групп файлов на большом количестве серверов.
Решение: состоит из 4 файлов, 2 пакетных, текстового (со списком серверов) и файла powershell.
1. основной файл:
rem создание необходимых для работы директорий.
if not exist log md log
if not exist temp md temp
rem для всех файлов из servers.txt вызываем файл из п.2
for /f %%i in (server.txt) do start /MIN call robo.cmd %%i
rem ждем пока не отработают все задания сбора статистики
:StartLoop
ping 127.0.0.1 /n 5
if exist temp\*p.lock GoTo :StartLoop
rem на основе файлов отчета по каждому серверу создаем один общий
findstr /i "older newer new" log\*.log > log\SOFT_STAT.txt
rem вызов сценария powershell. форматирование итогового файла
rem (нужно, чтоб потом загрузить результат в БД)
powershell -file replace.ps1 "log\SOFT_STAT.txt"
2. robo.cmd сбор статистики для одного сервера (из списка servers.txt)
@echo off
rem проверка физической доступности опрашиваемого сервера.
ping %1 /n 1 || (echo workstation is OFFLINE >"log\%1.log" & goto end)
rem преобразуем hostname в ip
FOR /F "tokens=2,3" %%A IN ('ping %1 -n 1 -4') DO IF "from"== "%%A" set "IP=%%~B"
echo %IP:~0,-1%
rem собственно net use
net use \\%IP:~0,-1%\c$ /user:localhost\dbax p@s$W0rd || (echo "net use failed" > "log\%1.log" & goto end)
rem создание .lock файла служит для того чтобы файл из п.1 дождался rem окончания работы всех отдельно запущенных .cmd
echo null > temp\%1.lock
rem сравнение файлового состава эталонного сервера с удаленным.
rem используется утилита robocopy с ключом /L
robocopy etalon\\%IP:~0,-1%\remote_path *.* /e /LOG:"log\%1.log" /NP /NDL /L /NJH /NJS /BYTES
rem отключение net use (просто для красоты)
net use \\%%IP:~0,-1%\c$ /delete
rem удаляем файл .lock - сигнализируем верхнему скрипты, что работа rem по серверу завершена
del temp\%1.lock
:END
exit
3. replace.ps1. Форматируем итоговый файл.
# принимаем параметры из предъидущего командного файла
# в нашем случае - это имя файла отчета log\SOFT_STAT.txt
param(
[string]$file
)
# удаляем префикс и расширение log в первом столбце отчета
(Get-Content $file) | Foreach-Object {
$_ -replace ("^log\\"), ("")
}| Set-Content $file
(Get-Content $file) | Foreach-Object {
$_ -replace (".log:"), ("")
}| Set-Content $file
# окружаем описание файла кавычками. Пригодится, если в именах
# каталогов есть пробелы и есть необходимосто потом гузить результат # в базу
(Get-Content $file) | Foreach-Object {
$_ -replace ("`c:"), ("`"c:")
}| Set-Content $file
(Get-Content $file) | Foreach-Object {
$_ -replace ("$"), ("`"")
}| Set-Content $file
4. servers.txt список серверов - просто текстовый файл вида:
server1
server2
В итоге получаем отчет вида:
сервер Older 6382592 "c:\myprogr\myprogr.exe"
Для выравнивания состава ПО на серверах достаточно убрать /L в команде robocopy
Решение: состоит из 4 файлов, 2 пакетных, текстового (со списком серверов) и файла powershell.
1. основной файл:
rem создание необходимых для работы директорий.
if not exist log md log
if not exist temp md temp
rem для всех файлов из servers.txt вызываем файл из п.2
for /f %%i in (server.txt) do start /MIN call robo.cmd %%i
rem ждем пока не отработают все задания сбора статистики
:StartLoop
ping 127.0.0.1 /n 5
if exist temp\*p.lock GoTo :StartLoop
rem на основе файлов отчета по каждому серверу создаем один общий
findstr /i "older newer new" log\*.log > log\SOFT_STAT.txt
rem вызов сценария powershell. форматирование итогового файла
rem (нужно, чтоб потом загрузить результат в БД)
powershell -file replace.ps1 "log\SOFT_STAT.txt"
2. robo.cmd сбор статистики для одного сервера (из списка servers.txt)
@echo off
rem проверка физической доступности опрашиваемого сервера.
ping %1 /n 1 || (echo workstation is OFFLINE >"log\%1.log" & goto end)
rem преобразуем hostname в ip
FOR /F "tokens=2,3" %%A IN ('ping %1 -n 1 -4') DO IF "from"== "%%A" set "IP=%%~B"
echo %IP:~0,-1%
rem собственно net use
net use \\%IP:~0,-1%\c$ /user:localhost\dbax p@s$W0rd || (echo "net use failed" > "log\%1.log" & goto end)
rem создание .lock файла служит для того чтобы файл из п.1 дождался rem окончания работы всех отдельно запущенных .cmd
echo null > temp\%1.lock
rem сравнение файлового состава эталонного сервера с удаленным.
rem используется утилита robocopy с ключом /L
robocopy etalon\\%IP:~0,-1%\remote_path *.* /e /LOG:"log\%1.log" /NP /NDL /L /NJH /NJS /BYTES
rem отключение net use (просто для красоты)
net use \\%%IP:~0,-1%\c$ /delete
rem удаляем файл .lock - сигнализируем верхнему скрипты, что работа rem по серверу завершена
del temp\%1.lock
:END
exit
3. replace.ps1. Форматируем итоговый файл.
# принимаем параметры из предъидущего командного файла
# в нашем случае - это имя файла отчета log\SOFT_STAT.txt
param(
[string]$file
)
# удаляем префикс и расширение log в первом столбце отчета
(Get-Content $file) | Foreach-Object {
$_ -replace ("^log\\"), ("")
}| Set-Content $file
(Get-Content $file) | Foreach-Object {
$_ -replace (".log:"), ("")
}| Set-Content $file
# окружаем описание файла кавычками. Пригодится, если в именах
# каталогов есть пробелы и есть необходимосто потом гузить результат # в базу
(Get-Content $file) | Foreach-Object {
$_ -replace ("`c:"), ("`"c:")
}| Set-Content $file
(Get-Content $file) | Foreach-Object {
$_ -replace ("$"), ("`"")
}| Set-Content $file
4. servers.txt список серверов - просто текстовый файл вида:
server1
server2
В итоге получаем отчет вида:
сервер Older 6382592 "c:\myprogr\myprogr.exe"
Для выравнивания состава ПО на серверах достаточно убрать /L в команде robocopy
Комментарии
Отправить комментарий