Vbs Script para hacer copia de seguridad de un fichero.
Scripts 12 mayo 2008

Quizás quieras hacer un script para que haga la tarea de copiar una serie de ficheros a un determinado sitio. A continuación pongo un ejemplo de un script que le he hecho a un amigo y que es bastante simple y efectivo.
En su caso tiene una pequeña empresa con ordenadores con correos electrónicos pero la empresa no es lo suficientemente grande como para emplear dinero en un servidor de correo pero si, necesitan backup del correo para no perder la información.
En el caso de Outlook Express la información se almacena en un archivo con extensión “pst”. En el ejemplo siguiente se hace copia de seguridad de ese fichero a una unidad “G:” que es una unidad compartida en un servidor y conectada al pc del usuario.
Por supuesto este script es completamente a vuestra disposición, es cuestión de retocar algunas cosas y adaptarla a tu entorno.
En primer lugar aquí está el código y, a continuación, voy a explicarlo:
[vb]
Set shell= WScript.CreateObject(“WScript.Shell”)
strUserName = shell.ExpandEnvironmentStrings(“%USERNAME%”)
Dim fso
set fso = CreateObject(“Scripting.FileSystemObject”)
lnDayOfWeek = weekday(now())
if lnDayOfWeek = 5 then
If fso.DriveExists(“G:”) Then
Dim lcDrive
Set lcDrive = fso.GetDrive(“G:”)
If lcDrive.IsReady Then
newfolderpath = “\\servername\users\” & strUserName & “\EmailBackup”
If Not fso.FolderExists(newfolderpath) Then
Set newfolder = fso.CreateFolder(newfolderpath)
End If
Dim file
file = “C:\Documents and Settings\” & strUserName & “\Local Settings\Application Data\Microsoft\Outlook\Outlook.pst”
If fso.FileExists(file) Then
fso.CopyFile “C:\Documents and Settings\” & strUserName & “\Local Settings\Application Data\Microsoft\Outlook\Outlook.pst”, “\\servername\users\” & strUserName & “\EmailBackup\Outlook.pst”
set fso = nothing
wscript.echo “¡Se ha completado tu backup del email!”
end if
end if
end if
end if
[/vb]
Básicamente, se inicia la creación de un objeto FileSystem que se encargará de copiar el archivo en el servidor. A continuación, hago un control para ver qué día de la semana es, lo hago solo los viernes ( por eso el 5), a fin de que el script se ejecute sólo una vez por semana.
También hay una comprobación para asegurarse de que la unidad G: está disponible (la unidad de red donde voy a copiar de los datos) antes de iniciar a la copia del fichero.
Entonces compruebo si existe la carpeta donde voy a copiar y si no, la creo. También compruebo que el archivo existe en el pc del usuario y si es así lo copio a la carpeta del usuario en la red. Yo uso el método shell.ExpandEnvironmentStrings ( “% USERNAME%”) para obtener el nombre del usuario actual.
Este script se puede aplicar como un script de inicio de sesión, utilizarse en una política de grupo o de cierre de sesión en Windows.
Vota este artículo:
Posts anterior y posterior:
- Previo: « Autoit3. Funcion para seleccionar el archivo mas actual de un directorio.
- Siguiente: Autoit3. Comprime ficheros por extensión. »


noviembre 13th, 2008 a las 2:52 pm
Estimado David, presiso un script que haga esto mismo. Al correrlo le hice modificaciones minimas de acuerdo a mis requerimientos.
Set shell= WScript.CreateObject(“WScript.Shell”)
strUserName = shell.ExpandEnvironmentStrings(“%USERNAME%”)
Dim fso
set fso = CreateObject(“Scripting.FileSystemObject”)
lnDayOfWeek = weekday(now())
if lnDayOfWeek = 1 then
If fso.DriveExists(“S:”) Then
Dim lcDrive
Set lcDrive = fso.GetDrive(“S:”)
If lcDrive.IsReady Then
newfolderpath = “\\Backups\” & strUserName & “\EmailBackup”
If Not fso.FolderExists(newfolderpath) Then
Set newfolder = fso.CreateFolder(newfolderpath)
End If
Dim file
file = “C:\Documents and Settings\” & strUserName & “\Local Settings\Application Data\Microsoft\Outlook\outlook.pst”
If fso.FileExists(file) Then
fso.CopyFile “C:\Documents and Settings\” & strUserName & “\Local Settings\Application Data\Microsoft\Outlook\outlook.pst”, “\\Backups\” & strUserName & “\EmailBackup\outlook.pst”
set fso = nothing
wscript.echo “¡Se ha completado tu backup del email!”
end if
end if
end if
end if
Ahora bien, tome la precaucion de modificar en el script la referencia al dia a la actual para qeu corra. Pero lo corro y no hace “aparentemente” nada. No me crea en el servidor las carpetas ni copia los archivos. Tamopoco si yo las creo manualamente. Podrias ayudarme al respecto?
noviembre 13th, 2008 a las 11:25 pm
Hola Andrés,
La verdad es que he probado el script en casa y he cambiado algunas cosas. Entre otras cosas en el outlook de casa no tengo pst por lo que he copiado la bandeja de entrada.
Debes cerciorarte de que el fichero de origen existe.
Las modificaciones son para crear todas las carpetas si no existen y la copia la hago a partir de la unidad I: que debe estar mapeada a algún sitio.
Por lo demás el script funciona perfectamente. Aqui te lo dejo:
[vb]
Set shell= WScript.CreateObject(“WScript.Shell”)
strUserName = shell.ExpandEnvironmentStrings(“%USERNAME%”)
Dim fso
set fso = CreateObject(“Scripting.FileSystemObject”)
lnDayOfWeek = weekday(now())
wscript.echo “Hoy es el dia de la semana ” & weekday(now())
if lnDayOfWeek = 3 then
If fso.DriveExists(“I:”) Then
Dim lcDrive
Set lcDrive = fso.GetDrive(“I:”)
If lcDrive.IsReady Then
newfolderpath = “I:\” & strUserName
If Not fso.FolderExists(newfolderpath) Then
wscript.echo “Creando: ” & newfolderpath
Set newfolder = fso.CreateFolder(newfolderpath)
End If
newfolderpath = “I:\” & strUserName & “\EmailBackup”
If Not fso.FolderExists(newfolderpath) Then
wscript.echo “Creando: ” & newfolderpath
Set newfolder = fso.CreateFolder(newfolderpath)
End If
Dim file
‘file = “C:\Documents and Settings\” & strUserName & “\Local Settings\Application Data\Microsoft\Outlook\Outlook.pst”
file=”C:\Documents and Settings\” & strUserName & “\Configuración local\Datos de programa\Identities\{3B7D1649-D0B6-4E33-83C6-E1D3F71399A2}\Microsoft\Outlook Express\Bandeja de entrada.dbx”
If fso.FileExists(file) Then
wscript.echo “Copiando: C:\Documents and Settings\” & strUserName & “\Configuración local\Datos de programa\Identities\{3B7D1649-D0B6-4E33-83C6-E1D3F71399A2}\Microsoft\Outlook Express\Bandeja de entrada.dbx”
fso.CopyFile “C:\Documents and Settings\” & strUserName & “\Configuración local\Datos de programa\Identities\{3B7D1649-D0B6-4E33-83C6-E1D3F71399A2}\Microsoft\Outlook Express\Bandeja de entrada.dbx”, “I:\” & strUserName & “\EmailBackup\Bandeja de entrada.dbx”
wscript.echo “Copiado!!!”
set fso = nothing
wscript.echo “¡Se ha completado tu backup del email!”
end if
end if
end if
else
wscript.echo “Hoy no toca backup.”
end if
[/vb]
noviembre 17th, 2008 a las 3:04 pm
David, muchas gracias! Funciono perfecto, eres muy amable!
No queriendo ser molesto, necesitaria incorporar unas variantes, paso a detallar;
1 – En los equipos con la version en Ingles de Win el pst se encuentra en esta otra ruta:
“C:\Documents and Settings\” & strUserName & “\Local Settings\Application Data\Microsoft\Outlook\outlook.pst”
Se podra agregar una sentencia que si no existe la carpeta “Configuracion local” valla a buscar a esta ruta?
2 – Ademas presisaria otro Script para: Eliminar Archivos con una determinada extencion (en mi caso *.001) que tengan como fecha de creacion mas de 15 dias de antiguedad. El script solo deberia buscar los archivos en la carpeta que yo le indique, no debiendo buscar en subcarpetas dentro de la misma.
E tomado algunas ideas de otros scripts publicados en tu web y llegue a algo como esto, pero algo tengo mal que no me funciona.
Set objfso = createobject(“scripting.filesystemobject”)
Set directorio = objfso.getfolder(“C:\temp”)
Set dirfiles = directorio.files
For Each d in dirfiles
If datediff(“d”,d.datecreated,now()) >= 15 Then
If Extension = “001″ Then
objfso.deletefile(d.path)
End If
End If
next
Podras darme una manito con todo esto? Si pudiera te daria un regalo por las molestias! Por lo pronto Muchas gracias!
diciembre 24th, 2008 a las 9:04 am
Buenos dias David y a todos:
Trabajo en un pequeña empresa que tiene un programa bastante inestable, y cada dos por tres perdemos datos, hacve un año hice un curso de programacion en shell scrip, sin ser experto ni mucho menos, me gustaria saber como hacer un scrip para que todos los dias el ordenador hiciese automaticamente. tengo windows xp profesional.
Un saludo y muchas gracias
Javier
diciembre 24th, 2008 a las 9:05 am
Se me olvido para que hiciese copias de seguridad automaticamente
enero 29th, 2009 a las 9:37 pm
bueno hola david yo soy nuevo en esto de scrips vbs pero me parece interesante el tema es el siguiente yo quiero copiar backup de una carpeta a otra maquina que tiene window 2003 server y me pide siempre un usuario y pasword para copiar dicha carpeta y yo ago esto todos los dias de manera clasica copoiando y pegando por favor me podrias decir o guiar como seria mi codificacion.
enero 30th, 2009 a las 10:26 pm
Helmut, se aprende probando.
Yo mapeatría la unidad con usuario y contraseña y lego utilizas este script.
Mapear:
[vb]
Dim WinExec, objFSO, WshShell, WSHNetwork
Set WSHNetwork = WScript.CreateObject(“WScript.Network”)
Set WinExec = CreateObject(“WScript.Shell”)
WSHNetwork.MapNetworkDrive “L:”, “\\Labsrv\Export”,”False”,”dominio\usuario”,”pwd”
objShell.NameSpace(“L:”).Self.Name = “Lab”
Wscript.Sleep 10000
‘aqui el código de copia de seguridad
WScript.Quit
[/vb]
agosto 27th, 2009 a las 8:40 pm
Hola.
Yo lo que hago es mapear la unidad y despues hacer mi copia pero son muy grandes mis archivos lo que hace es que me los copia corrupto y me manda este error.
The specified network name is no longer available. (Exception from HRESULT: 0×80070040)
este es mi codigo no se q hacer me podran ayudar, muchas gracias.
Dim objNetwork, objFSO
Dim strDriveLetter, strRemotePath, strProfile, strUser, strPassword
strDriveLetter = “P:”
strRemotePath = “\\nombre_equipo\c$”
strProfile = “False”
strUser = “Usuario”
strPassword = “xxx”
objNetwork = CreateObject(“WScript.Network”)
objNetwork.MapNetworkDrive(strDriveLetter, strRemotePath, strProfile, strUser, strPassword)
objFSO = CreateObject(“Scripting.FileSystemObject”)
objFSO.CopyFile(“C:\cheq\Respaldo\respaldo.zip”, “P:\”)
diciembre 29th, 2009 a las 4:16 pm
por medio de un . bat trato de ejecutar esta linea de codigo pero dice que no reconoce -Configuración local-
cd C:\Documents and Settings\xxxxx\Configuración local\Temp
necesito que por favor me colaboren, lo que trato hacer es entrar para borrar la informacion pero me falla la ruta
gracias
diciembre 29th, 2009 a las 11:26 pm
Anfell, si quieres ir a la ruta que has hecho usa las variables %TEMP% o %TMP%.
De otro modo encierra tu ruta entre comillas.
marzo 20th, 2011 a las 2:12 am
David, puesdes ayudarme? En un folder de mi FTP recibo archivos (textos y fotografias) quisiera que el contenido se copie -sincronizandose- a un disco diferente (backup) una o dos veces al dia. Pense que mediante un script podria lograr esto. Es asi? como debo hacerlo ?
gracias
marzo 23rd, 2011 a las 8:29 pm
Alex, esta noche te escribo un nuevo post con una utilidad que te ayudará a hacer lo que necesitas de forma muy sencilla.
Ponme un comentario si te gusta o te ha servido.
junio 22nd, 2011 a las 11:15 pm
Necesito hacer un script .vsb para pasarlo por politica en el AD, el problema es que por alguna razon requiero copiar unos archivos pero debe ser con usuario administrador ya que hay usuarios que no tiene privilegios.
Pero no tengo idea de como programar algo como esto
runas /user:dominio\administrador “password”
@Echo Off
echo Actualizado Archivos de SAP
net use l: \\10.0.1.5\compartido
xcopy “l:logos sap\Attachments\*.*” “c:\Program Files\SAP\SAP Business One\Attachments\” /Y
net use l: /delete
No se como hacer para resolverlo.
mayo 17th, 2012 a las 10:14 pm
Que tal David, me agrada tu script para respaldar el pst, que es justo lo que requiero, solamente lo que yo necesito es respaldarlo diario, lo intente con tu script y con este otro:
Set shell= WScript.CreateObject(“WScript.Shell”)
strUserName = shell.ExpandEnvironmentStrings(“%USERNAME%”)
Const OverwriteExisting = True
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
objFSO.CopyFile “C:\Documents and Settings\”&strUserName&”\Escritorio\Prueba script\*.*” , “J:\Prueba script\”, OverwriteExisting
pero en la linea 5, Caracter 1, me marca error de directorio, no se si este haciendo algo mal en la parte de validacion del usuario, ya que poniendo la ruta sin la corroboracion del usuario si me efectua la copia.
Espero puedas asesorarme gracias.