Fórum Ajuda script em .bat #444594
03/06/2013
0
Tenho um banco postgres em um servidor linux e em um servidor windows. Fiz um script para o servidor linux que me retorna os nomes de todos os bancos postgres no servidor. Mas para windows, estou querendo fazer um script em .bat, para fazer o mesmo. Mas não tenho conhecimento suficiente em scripts .bat, alguém pode me ajudar?
Andrei Claro
Curtir tópico
+ 0Posts
06/06/2013
Andrei Claro
Seguinte, tenho uma rede de servidores sendo monitorados pelo Zabbix, e tenho bancos de dados instalados em servidores linux e windows. Pois bem, estava precisando de um script que me retorna-se uma string assim:
{\"data\":[{\"{#DBNAME}\":\"nomebanco1\"},{\"{#DBNAME}\":\"nomebanco2\"},...,{\"{#DBNAME}\":\"nomebancon\"}]}
Comecei a pesquisar para fazer isso nos servidores linux, pois eu acho bem mais fácil. Sendo assim, consegui encontrar um blog que me ajudou com o script para DB postgres (foi o script que postei inicialmente). A partir deste script desenvolvi um para MySQL e foi um sucesso. Tudo funcionou perfeitamente para os DBs instalados nos servidores linux, que são CentOS.
Ai começou minha dor de cabeça. Para fazer isso nos DBs dos servidores windows eu pensei em fazer um script .bat que me retornasse exatamente a mesma string, o problema é que estava me aventurando em um campo que eu não conheço quase nada.
Bem, inicialmente fui tentar fazer o bat para o DB postgres, usando como referência o script do linux. Ralando muito consegui chegar a um script que esta quase perfeito:
@echo off
setlocal enabledelayedexpansion
cd C:\Program Files\PostgreSQL\9.2\bin
psql --dbname postgres -U zabbix -Atc "\l" | find "|" /c > C:\zabbix\externalscripts\db_postgres\nresult.txt
psql --dbname postgres -U zabbix -Atc "\l" | find "|" > C:\zabbix\externalscripts\db_postgres\dbresult.txt
cd C:\zabbix\externalscripts\db_postgres
set /p lines=<nresult.txt
set lines=%lines: =%
del nresult.txt
set loop=1
echo {\"data\":[ > listpg.txt
for /f "tokens=1 delims=|" %%a in (dbresult.txt) do (
if !loop! == %lines% (
echo {\"{#DBNAME}\":\"%%a\"}
goto exit
)
set /a loop=!loop!+1
echo {\"{#DBNAME}\":\"%%a\"},
)
:exit
del dbresult.txt
echo ]}
O problema deste script agora é que ele me retorna varios "echo", um em cada linha e eu preciso de toda a saída em uma linha. Tentando resolver o problema joguei os resultados para um arquivo, fazendo assim:
@echo off
setlocal enabledelayedexpansion
cd C:\Program Files\PostgreSQL\9.2\bin
psql --dbname postgres -U zabbix -Atc "\l" | find "|" /c > C:\zabbix\externalscripts\db_postgres\nresult.txt
psql --dbname postgres -U zabbix -Atc "\l" | find "|" > C:\zabbix\externalscripts\db_postgres\dbresult.txt
cd C:\zabbix\externalscripts\db_postgres
set /p lines=<nresult.txt
set lines=%lines: =%
del nresult.txt
set loop=1
echo {\"data\":[ > listpg.txt
for /f "tokens=1 delims=|" %%a in (dbresult.txt) do (
if !loop! == %lines% (
echo {\"{#DBNAME}\":\"%%a\"} >> listpg.txt
goto exit
)
set /a loop=!loop!+1
echo {\"{#DBNAME}\":\"%%a\"}, >> listpg.txt
)
:exit
del dbresult.txt
echo ]} >>listpg.txt
Beleza, foi direitinho, mas não em uma linha. Ele esta gravando assim:
{\"data\":[
{\"{#DBNAME}\":\"nomebanco1\"},
{\"{#DBNAME}\":\"nomebanco2\"},
...
{\"{#DBNAME}\":\"nomebancon\"}
]}
::onde n= quantidade de bancos
Estou pedindo uma ajuda de alguém que souber. Como faço para editar um arquivo txt usando um script .bat para organizar o texto todo em uma linha, ou melhor, deletar os "enters" e os espaços?
Alguém pode me ajudar?
Desde ja agradeço a todos do fórum.
Gostei + 0
07/06/2013
Andrei Claro
Depois de muita, mas muita pesquisa consegui resolver meu problema.
Seguinte, para poder monitorar o tamanho dos meus DBs postgres no zabbix eu alterei metade do script .bat que tinha feito.
Desisti de usar arquivos txt e um colega me ajudou a jogar os valores dentro das viriaveis diretamente.
O script ficou assim:
@echo off
setlocal enabledelayedexpansion
cd C:\Program Files\PostgreSQL\9.2\bin\
for /f "delims=" %%a in ('psql.exe --dbname postgres -U zabbix -Atc "\l" ^| find "|" /c') do @set lines=%%a
set loop=1
set out={\"data\":[
for /f "tokens=1 delims=|" %%a in ('psql.exe --dbname postgres -U zabbix -Atc "\l" ^| find "|"') do (
if !loop! == %lines% (
set out=!out!{\"{#DBNAME}\":\"%%a\"}
goto exit
)
set /a loop=!loop!+1
set out=!out!{\"{#DBNAME}\":\"%%a\"},
)
:exit
set out=!out!]}
echo %out%
Se alguém precisar de alguma dica para fazer o mesmo, estou a disposição.
Falou!!
Gostei + 0
07/06/2013
Andrei Claro
Lembrando que esse script é prar se utilizado com o zabbix!
:: Autor: Andrei Tunes
:: Data: 06/06/2013
@echo off
setlocal enabledelayedexpansion
cd C:\Program Files\PostgreSQL\9.2\bin\
for /f "delims=" %%a in ('psql.exe --dbname postgres -U zabbix -Atc "\l" ^| find "|" /c') do @set lines=%%a
set loop=1
set out={"data":[
for /f "tokens=1 delims=|" %%a in ('psql.exe --dbname postgres -U zabbix -Atc "\l" ^| find "|"') do (
if !loop! == %lines% (
set out=!out!{"{#DBNAME}":"%%a"}
goto exit
)
set /a loop=!loop!+1
set out=!out!{"{#DBNAME}":"%%a"},
)
:exit
set out=!out!]}
echo %out%
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)