Anuncios
Anuncios

Bienvenidos sean a este post, una de las particularidades que ofrecia VBScript como lenguaje de navegador era la posibilidad de poder acceder al disco y no solamente crear archivos, sino tambien a la informacion del mismo asi como tambien poder borrar o manejar los mismos.

Si bien habia que conceder algunos permisos no era muy dificil de lograr, esto pudo haber sido una gran ventaja sobre otros lenguajes pero tambien abria la posibilidad a un codigo malicioso de poder manipular nuestros archivos 😱

Nosotros lo estudiaremos porque para nuestro principal estudio mas adelante sera para la creacion de archivos que nos permitan tener un log de lo realizado, esto es ideal para una depuracion en caso de error y tambien para ver que se estuvo haciendo durante la ejecucion, para entender el concepto veamos un ejemplo simple:

discos.vbs

dim texto

set objfso = CreateObject("Scripting.FileSystemObject")

for each objDrive in objfso.drives
	texto = texto & "Unidad: " & objDrive.driveletter & vbCrLf
	texto = texto & "Sistema de archivos: " & objDrive.filesystem & vbCrLf
	texto = texto & "Serial number: " & objDrive.serialnumber & vbCrLf
	texto = texto & "Nombre del volumen: " & objDrive.volumename & vbCrLf
	texto = texto & "Tamaño: " & objDrive.totalsize & vbCrLf
	texto = texto & "Espacio libre: " & objDrive.freespace & vbCrLf
next

msgbox texto,64,"Datos de tus discos"
Anuncios

Con este ejemplo simple obtendremos algunos datos del disco, primero creamos una variable llamada texto, luego usaremos a CreateObject para hacer al que realmente hace la magia para vincularlo con Scripting y al metodo FileSystemObject, nuestro siguiente paso sera utilizar un bucle for pero con la particularidad que vimos en este post porque nos permite pasar por cada uno de los objetos contenidos en objfso y pasar las propiedades de cada uno de estos objetos, por ejemplo para este caso pasaremos por todas las unidades de nuestro equipo y nos devolvera primero la unidad, luego el tipo de archivo, despues el numero de serie del disco, luego el nombre de la unidad, despues el tamaño total del disco y por ultimo el espacio libre del mismo, una vez compilada esta informacion dentro de texto la mostraremos en pantalla

Anuncios

Como pueden observar obtenemos una informacion bastante detallada de nuestros discos, en este caso nuestro disco con dos particiones y si existieran mas aparecerian en este mensaje final, veamos una tabla con algunas de las propiedades disponibles:

PropiedadDescripcion
DriveTypeDevuelve el tipo de unidad
DriveLetterDevuelve la unidad asignada
TotalSizeDevuelve el tamaño del disco
FreeSpaceDevuelve el espacio libre
AvailableSpaceDevuelve el espacio disponible que no siempre es el libre
SerialNumberDevuelve el numero de serial que representa a la unidad
VolumeNameDevuelve el nombre de la unidad
FileSystemDevuelve tipo de formato de la unidad
isReadyNos devuelve si la unidad esta lista para usarse, por ejemplo un lector de DVD o BD
ShareNameDevuelve el nombre otorgado a un recurso compartido si lo conectamos como Unidad
PathDevuelve la ruta para conectarnos a la unidad
Anuncios

Si bien esta bastante claro ahondemos en algunas propiedades, por ejemplo FreeSpace y AvailableSpace son practicamente iguales pero la diferencia va a ser que FreeSpace nos va a devolver el espacio libre y AvailableSpace si estamos en un servidor donde maneja “quota”, es decir espacio asignado a usuarios o recursos, nos devolvera el verdadero espacio disponible sin contar estos espacios reservados, isReady esta pensado para unidades opticas, entiendase lectoras de CD-ROM, DVD o BlueRay para saber cuando tienen el disco para ser usado, Path nos devolvera en el caso de unidades la letra para acceder a la misma (c:) o el UNC completo:

\\servidor\recurso
Anuncios

Por ultimo tenemos a DriveType que nos devolvera cual es el tipo de unidad pero con un valor numerico, veamos la siguiente tabla:

ValorDescripcion
0Desconocida
1Unidad Removible
2Disco Duro
3Unidad o recurso de red
4CD-ROM
5Unidad virtual en memoria RAM
Anuncios

En este caso para devolver una mejor respuesta es conveniente usar un select case con los valores y relacionarlo a alguna descripcion pero no solamente podemos obtener estos datos sino tambien el contenido de la unidad, tomemos el ejemplo anterior y modifiquemoslo de la siguiente manera:

dim texto

set objfso = CreateObject("Scripting.FileSystemObject")

for each objDrive in objfso.drives
  texto = texto & "Unidad: " & objDrive.driveletter & vbCrLf
  for each objFolder in objdrive.rootfolder.subfolders
	texto = texto & objFolder.name & " / "
	texto = texto & objFolder.path & vbCrlf
  next
next

msgbox texto,64,"Datos de tus discos"
Anuncios

En este caso mantenemos el primer for para pasar por todas las unidades, para la cual usaremos nuevamente a DriveLetter para identificarla, luego volveremos a usar un bucle for de forma similar al anterior pero esta vez usaremos al objeto anterior (objDrive) y la agregaremos dos colecciones, una es rootfolder (la cual representa a la raiz de nuestra unidad) y luego a subfolders que son todas las carpetas de nuestra raiz (rootfolder), para almacenar a las mismas usamos a objFolder a la cual le pasaremos a texto las propiedades name y path que representan el nombre completo de la carpeta y el path completo respectivamente, una vez finalizado los dos ciclos pasaremos a mostrar el mensaje en pantalla

Como pueden ver no solamente obtuvimos el nombre sino tambien la direccion completa de la carpeta, veamos algunas de las propiedades de este objeto en la siguiente tabla:

PropiedadDescripcion
SubFoldersColeccion de objetos ‘Folder’ que representa las carpetas del directorio considerado
NameNombre de la carpeta representada
SizeTamaño de la carpeta
PathRuta completa de la carpeta
ShortnameDevuelve el nombre corto de la carpeta
ShortPathDevuelve el path corto de la carpeta
ParentFolderDevuelve una referencia a la carpeta padre o superior
DateCreatedDevuelve la fecha de creacion de la carpeta
DateLastAcceddedDevuelve la fecha de la ultima vez que se accedio
DateLastModifiedDevuelve la fecha de la ultima vez que se modifico
AttributesPermite obtener y modificar los atributos de una carpeta
Anuncios

En este caso tenemos las propiedades que nos pueden resultar mas utiles, antes de continuar hablemos sobre Attributes la cual nos permite modificar o ver los permisos y/o atributos sobre una carpeta, para ello debemos usar los valores de la siguiente tabla:

ConstanteValorDescripcion
Normal0Sin atributos
ReadOnly1Solo lectura
Hidden2Oculto
System3Sistema
Volume4Etiqueta del volumen
Directory16Indica que es una carpeta
Archive32Indica que ha cambiado desde la ultima copia de seguridad
Alias64Acceso directo
Compressed128Se trata de un archivo comprimido
Anuncios

En general son bastante sencillos salvo la ultima constante donde no indica si el archivo es .ZIP o de algun otro compresor sino mas bien de una particularidad propia de NTFS como es comprimir los archivos para que ocupen menos espacio en el disco, esto era util en los viejos tiempos de discos mas chicos pero disminuia muchisimo la performance de acceso, hoy en dia no se utiliza tanto, todo lo visto hasta ahora pertenece al objeto Folder pero este objeto a su vez no ofrece algunos metodos para poder trabajar con las carpetas, ya sea copiar, mover o inclusive borrar las mismas, veamos el siguiente ejemplo:

dirs.vbs


set objfso = CreateObject("Scripting.FileSystemObject")

objfso.drives("c").rootfolder.subfolders("otraprueba").copy objfso.drives("c").rootfolder.subfolders("prueba")

objfso.drives("c").rootfolder.subfolders("otraprueba").move objfso.drives("c").path & "prueba2"

objfso.drives("c").rootfolder.subfolders("prueba2").delete

wscript.echo "Listo el pollo" & vbCrLf & "Pelada la gallina"
Anuncios

Para este ejercicio les recomiendo primero crear en la raiz del disco C una carpeta llamada “prueba” y otra llamada “otraprueba” tambien en el raiz y en la carpeta otraprueba creen un archivo de texto o pongan cualquier otro con el nombre que quieran, volviendo a nuestro codigo primero creamos el objeto para manipularlas, luego haremos la accion de copiar donde primero especificaremos el origen, en este caso le diremos a Drives que la unidad es C, luego le decimos que use a rootfolder y subfolders donde le especificaremos la carpeta de origen (otraprueba) y le pasamos el metodo de copy, luego dejamos un espacio y le especificamos el destino, de la misma forma pero en este caso especificamos prueba, para nuestro siguiente caso hacemos exactamente lo mismo pero en este caso moveremos la carpeta por medio de move, aunque en realidad no la moveremos sino que la renombraremos de “otraprueba” a “prueba2” y por ultimo lo borraremos por medio de delete, en este caso volvemos a usar rootfolder y subfolders especificando a “prueba2” y por ultimo el metodo delete, nuestro mensaje final sera para notificarnos que termino el mismo, dado que ninguno de los metodos anteriores nos notificara algo, si lo probamos se vera asi:

C:\>cscript c:\users\mirandma\Desktop\dirs.vbs
Microsoft (R) Windows Script Host versión 5.812
Copyright (C) Microsoft Corporation. Reservados todos los derechos.

Listo el pollo
Pelada la gallina

C:\>
Anuncios

Pero si nosotros verificamos el directorio veremos que existen la carpeta prueba pero no existen otraprueba ni tampoco prueba2 y tendremos el contenido de otraprueba en prueba.

Anuncios

En resumen, hoy hemos visto como acceder al sistema de archivos, el poder de esta herramienta, todos los datos que podemos obtener, las acciones que podriamos tomar con los permisos correctos, se que es uno de los poco lenguajes para navegador que permite esto en el lado del cliente, en el proximo post continuaremos con este tema pero nos centraremos mas en los archivos, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes comprar mi libro sobre VBscript en Amazon

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00