Autor
|
Tema: Duda con sript vbs (Leído 3,260 veces)
|
solaire
Desconectado
Mensajes: 9
|
Buenas! Os comento, para ser sincero nunca he programado en vbs hasta hace unos dias he tenido que hacer un vbs que me sacara el espacio libre de las particiones y que en caso de estar por debajo de 10GB lo mandase por correo El caso es que mirando esto el tuto de esta pagina http://foro.elhacker.net/scripting/tutorial_vbscript-t229032.0.html y varias paginas mas consegui hacer uno que funcionase en mi pc correctamente, hasta ahi todo bien pero cuando pruebo en otro pc diferente sale error El codigo es: Set objWMIService = GetObject( "winmgmts:\\.\root\cimv2" ) Set colItems = objWMIService.ExecQuery ("Select * From Win32_Volume Where DriveType = 3") For Each objItem In colItems FSpace=objItem.FreeSpace FSpace = (FSpace / 1024^3) ispc2 = cDbl(objItem.FREESpace) if FSpace < 10 Then msg = "1" texto = "La unidad: " & objItem.DriveLetter & " Tiene un espacio libre menor de 10GB, tiene un total de " & FormatiSpc(ispc2) & " GB libres | " text = text & vbNewLine & texto end if Next Function FormatiSpc(intSpace) intSpace = intSpace/1024 intSpace = intSpace/1024 intSpace = intSpace/1024 intSpace= FormatNumber(intSpace,1) FormatiSpc = intSpace end Function msg = strComputerName & vbNewLine & text if msg <> "" then sendMAIL(msg) end if Sub sendMAIL(msg) Dim strbody strbody = msg + chr(13) + chr(10) set objcdo=createobject("cdo.message") objcdo.subject="Espacio libre en particiones" objcdo.from="kortiz@wisco.es" objcdo.to="kortiz@wisco.es" objcdo.textbody= strbody objcdo.configuration.fields.item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 objcdo.configuration.fields.item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.2.230" objcdo.configuration.fields.item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 objcdo.configuration.fields.item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30 objcdo.configuration.fields.item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = 1 objcdo.configuration.fields.update objcdo.send End Sub
Seguro que habrá varias cosas mal pero yo no las veo, como ya digo soy un principiante en esto del vbs, el caso es que no veo que falla, en mi pc va perfecto y en el otro da eses error que es como si no guardase nada de colItem Espero que me podais ayudar, he estado probando varias cosas y nada... Saludos
|
|
« Última modificación: 22 Enero 2015, 08:52 am por Eleкtro »
|
En línea
|
|
|
|
Shell Root
|
Hasta aquí te lo dejo bien, SET oWMI = GetObject("winmgmts:\\.\root\cimv2") SET oItems = oWMI.ExecQuery("SELECT * FROM Win32_Volume WHERE DriveType = 3") Dim oFSpace, oFREESpace For Each oItem In oItems oFSpace = oItem.FreeSpace oFSpace = (oFSpace/ (1024^3)) oFREESpace = cDbl(oItem.FREESpace) ' Me generaba un error porque [oItem.DriveLetter] me ' devolvia una string Null asi que utilice la función ' [IsNull] para validarlo. If oFSpace < 10 And IsNull(oItem.DriveLetter) = False Then MsgBox "La unidad: " & oItem.DriveLetter & " tiene un espacio de: " & FormatSpace(oFREESpace) End If Next Function FormatSpace(oSpace) oSpace = oSpace/1024 oSpace = oSpace/1024 oSpace = oSpace/1024 oSpace= FormatNumber(oSpace, 1) FormatSpace = oSpace end Function
|
|
« Última modificación: 21 Enero 2015, 23:42 pm por Shell Root »
|
En línea
|
Te vendería mi talento por poder dormir tranquilo.
|
|
|
solaire
Desconectado
Mensajes: 9
|
Hasta aquí te lo dejo bien, SET oWMI = GetObject("winmgmts:\\.\root\cimv2") SET oItems = oWMI.ExecQuery("SELECT * FROM Win32_Volume WHERE DriveType = 3") Dim oFSpace, oFREESpace For Each oItem In oItems oFSpace = oItem.FreeSpace oFSpace = (oFSpace/ (1024^3)) oFREESpace = cDbl(oItem.FREESpace) ' Me generaba un error porque [oItem.DriveLetter] me ' devolvia una string Null asi que utilice la función ' [IsNull] para validarlo. If oFSpace < 10 And IsNull(oItem.DriveLetter) = False Then MsgBox "La unidad: " & oItem.DriveLetter & " tiene un espacio de: " & FormatSpace(oFREESpace) End If Next Function FormatSpace(oSpace) oSpace = oSpace/1024 oSpace = oSpace/1024 oSpace = oSpace/1024 oSpace= FormatNumber(oSpace, 1) FormatSpace = oSpace end Function
Lo primero, muchas gracias por la ayuda e interes, Y lo segundo, hasta donde llego yo (que es poco xD) lo que hace es que si llega DriveLetter vacio osea que no coge nada no de error con el IsNull, pero lo que me interesa saber por que no me coje nada de ahi porque si lo dejas asi te manda un correo en blanco =S Saludos
|
|
|
En línea
|
|
|
|
solaire
Desconectado
Mensajes: 9
|
Perdon Perdon Shell root si esta bien si si no encuentra ninguna particion por debajo envia el correo vacio Espero que no te importe que te pregunte..¿Hay alguna forma de que no envie ningun correo si no encuentra ninguna particion por debajo de los 10gb? ¿Asi de pronto se me ocurre un "si esta vacio" el mensaje pero no se bien como hacerlo, me pondre a ello haber si me sale (aunque lo dudo ¬¬) Gracias de nuevo
|
|
|
En línea
|
|
|
|
Shell Root
|
Crea un procedimiento para enviar el correo e ingresalo dentro, If oFSpace < 10 And IsNull(oItem.DriveLetter) = False Then MsgBox "La unidad: " & oItem.DriveLetter & " tiene un espacio de: " & FormatSpace(oFREESpace) Call SendEmail() End If
|
|
|
En línea
|
Te vendería mi talento por poder dormir tranquilo.
|
|
|
solaire
Desconectado
Mensajes: 9
|
No entiendo bien, quieres que añada el call sendemail para llamar al procedimiento de mi vbs o que haga uno nuevo y que meta eso para llamarlo?.. seguro que sera facil lo que me dices pero entre que estoy hecho un lio y aparte que no se me da nada bien esto del vbs no lo entiendo salu2
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.878
|
Lo que te está dicidiendo es que llames al método dentro del bloque del if, es decir, cuando la condición da positivo. Solo tienes que insertar la modificación que el compañero @ShellRoot te ha indicado, si lo haces así entonces ningún email se va a enviar si la condición no da True. Puedes simplificar un poco el código, de esta manera: Option Explicit : Dim freeSpace, minSpace, wmiQuery, obj minSpace = 10.0 ' GigaBytes Set wmiQuery = _ GetObject("winmgmts:\\.\root\cimv2"). _ ExecQuery("SELECT DriveLetter,FreeSpace From Win32_Volume Where DriveType = 3") For Each obj In wmiQuery freeSpace = CDbl(FormatNumber(obj.FreeSpace / (1024 ^ 3), 1)) If Not IsNull(obj.DriveLetter) And (freeSpace < minSpace) Then Call MsgBox("La unidad: " & obj.DriveLetter & " tiene un espacio de: " & freeSpace, _ 48, "Email Backup") Call SendEmail("from@", "to@") End If ' freeSpace Next ' obj In wmiQuery Sub SendEmail(mailFrom, mailTo) ' ... End Sub
Saludos
|
|
« Última modificación: 22 Enero 2015, 17:10 pm por Eleкtro »
|
En línea
|
|
|
|
solaire
Desconectado
Mensajes: 9
|
Lo intentare hacer ya mañana que hoy no tengo tiempo.. gracias por las respuestas!
|
|
|
En línea
|
|
|
|
solaire
Desconectado
Mensajes: 9
|
OK funciona a la perfeccion, he estado intentando hacer una pequeña variacion, un codigo que me envie solo en un email las particiones por debajo per 10 poniendo un if isEmpty antes del sendMail pero no me ha salido, en fin asi se me va a quedar que el que me habeis dado va de perlas Muchas gracias a los dos por la ayuda Saludos
|
|
|
En línea
|
|
|
|
|
|