[VBS] Iniciación, dudas rutas.

Iniciado por KZN, 28 Enero 2016, 17:25 PM

0 Miembros y 1 Visitante están viendo este tema.

KZN

Hola, estoy empezando con el lenguaje VBScript y quería saber como llego a las siguientes rutas %appdata%
%userprofile%
También tengo un problema con las carpetas, por ejemplo hay una carpeta que tiene el nombre

123456.default

esa carpeta independientemente del nombre siempre tiene el ".default" y yo en Batch usaba esta variable para entrar en la carpeta " cd "*.default" " y ahora nose como hacer lo mismo en VBS.
Espero me ayuden, gracias futuros comentarios siempre es de agradecer la ayuda.

(Si e cometido algún error lo siento, ya hacía bastante que no entraba al foro y no me acuerda si me salto alguna regla.)

fary

Código (vb) [Seleccionar]
Set Shell = CreateObject( "WScript.Shell" )
Msgbox Shell.ExpandEnvironmentStrings("%APPDATA%")


Para las carpetas.... ¿Porqué no pones el nombre de la carpeta entera y listo?. Creo que no hay nada similar en VBS.

Un byte a la izquierda.

Eleкtro

#2
Cita de: KZN en 28 Enero 2016, 17:25 PMyo en Batch usaba esta variable para entrar en la carpeta " cd "

Para cambiar el directorio de trabajo actual puedes utilizar la siguiente propiedad:

Ejemplo:
Código (vb) [Seleccionar]
Set WshShell = WScript.CreateObject("WScript.Shell")
dirPath = ".\.default"

WshShell.CurrentDirectory = dirPath

Wscript.Echo(WshShell.CurrentDirectory)
Wscript.Quit(0)


Para expandir variables de entorno ya te explicaron como hacerlo, solo quiero añadir que se expandirá cualquier variable que exista en el string que recibe la función, es decir, para aprovechar esta funcionalidad y evitar código innecesario siempre puedes llamar a la función de la siguiente manera (en caso de que lo necesites):
Código (vb) [Seleccionar]
ExpandEnvironmentStrings("%AppData%\.default")

Saludos








KZN

#3
No me e explicado bien, os voy enseñar el código batch para que me entendaís

Código (dos) [Seleccionar]
cd %appdata%

cd Micarpeta\MiSubcarpeta

cd "*.default"


Esa carpeta cada vez que cambio de ordenador es renombrada por ejemplo

PC 1: 123456.default

PC 2: 4fasdjkt.default

PC 3: 57tgjtekl.default

esa carpeta con nombre aleatorio (salvo el .default) tiene unos archivos que siempre recojo por extensión

Código (dos) [Seleccionar]
xcopy "*.png" "C:\ProgramData" /Y /I >nul 2>&1

Y ahora busco hacer lo mismo en VBS e elaborado este pequeño code

Código (vb) [Seleccionar]
Set objShell = CreateObject("WScript.Shell")
Set PV1 = CreateObject("Scripting.FileSystemObject")
Set PV2 = CreateObject("Scripting.FileSystemObject")

PV2.createfolder "C:\ProgramData\Carpeta"
strCommand = "cmd /k cd %appdata%"
strCommand = "cmd /k cd Micarpeta\MiSubcarpeta"

PV1.copyfile "%USERPROFILE%\123456.default\*.png","C:\ProgramData\Carpeta\"

MsgBox "Operación completada",266304

Espero me podaís ayudar y gracias a los anteriores por su colaboración.

Eleкtro

#4

@KZN                                          
Usa las etiquetas Geshi para insertar código  





Me arriesgo a deducir que el problema real es querer averiguar el nombre de carpeta del perfil por defecto de Firefox ya que precisamente se generan con ese tipo de nombre bajo el mismo directorio principal,
si me equivoco y no son tus intenciones entonces disculpa, pero si no me equivoco entonces no se por que motivo no mencionas ese detalle y deberias explicar el problema real para poder darte soluciones óptimas, ya que del modo en el que lo estás intentando hacer no es para nada una solución óptima, por que preguntando por otras cosas como averiguar el nombre de carpetas basándose en un patrón de búsqueda lo único que conseguirás es complicarlo todo (y sería una pérdida de tiempo para los demás).

Puedes obtener el nombre de los directorios simplemente parseando la propiedad Path del archivo de inicialización (.ini) de perfiles de Firefox, ubicado exactamente en C:\Users\usuario\AppData\Roaming\Mozilla\Firefox\Profiles.ini.

Por favor, específica si ese es tu propósito real para explicarte como parsear el archivo, o de lo contrario para explicarte otra solución distinta al problema que has mencionado con una solución de búsqueda de carpetas según un patrón de búsqueda...

Saludos








KZN

Si, como siempre Elektro me lees la mente, efectivamente, es hay a donde quiero acceder.

Eleкtro

#6
Cita de: KZN en 29 Enero 2016, 01:06 AMSi, como siempre Elektro me lees la mente, efectivamente, es hay a donde quiero acceder.

El siguiente algoritmo no es perfecto, he intentado tener en cuenta que las propiedades del archivo ini pueden estar cambiadas de posición, pero en un 99% de los casos te funcionará ya que no hay por que pensar que alguien manipule este archivo para añadir perfiles manualmente...:

Código (vb) [Seleccionar]
Set fso      = CreateObject( "Scripting.FileSystemObject" )  
Set wshShell = CreateObject( "WScript.Shell" )

Function SetProfilePath( directorypath, isRelative )
   
   If ( isRelativePath ) then
       SetProfilePath = (firefoxDirPath & "\" & directorypath)

   Else
       SetProfilePath = directorypath

   End If

End Function

firefoxDirPath   = wshShell.ExpandEnvironmentStrings( "%AppData%\Mozilla\Firefox" )
profilesIniPath  = ( firefoxDirPath & "\" & "Profiles.ini" )
profilePath      = ""
isRelativePath   = False
isDefaultProfile = False

Set profilesIni  = fso.OpenTextFile( profilesIniPath )

Do Until profilesIni.AtEndOfStream
 
   line = profilesIni.ReadLine()
   
   If ( InStr(1, line, "Path=") = 1 ) then
       
       profilePath = SetProfilePath(Replace( Mid(line, ( Len("Path=") + 1) ), "/", "\" ), isRelativePath)

   End if
   
   If ( InStr(1, line, "IsRelative=1") = 1 ) then
     
       isRelativePath = True

       If ( profilePath <> "" ) then
           profilePath = SetProfilePath(profilePath, True)
         
           If ( isDefaultProfile ) then
               Exit Do
           End If

       End If

   End if

   If ( InStr(1, line, "Default=1") = 1 ) And ( profilePath <> "" ) Then
       Exit Do

   Elseif ( InStr(1, line, "Default=1") = 1 ) Then
       isDefaultProfile = True

   End if

Loop
profilesIni.Close()

Wscript.Echo(profilePath)
Wscript.Quit(0)


Si fuese en otro lenguaje menos limitado (ej. Vb.Net) la tarea de lectura de la estructura ini sería más sencilla y mucho más eficiente, pero no quiero invertir más tiempo desarrollándolo en VBS, creo que con ese script es suficiente al menos para darte la idea inicial a pesar de los posibles fallos en ciertas circunstancias que ya mencioné.

Lo cierto es que otra manera de hacerlo mucho más sencillo sería enumerando las carpetas del directorio de perfiles y con una expresión regular determinar el nombre completo de la carpeta con la expresión "^.+\.default$" (por ejemplo), esto sería mucho más simple, pero a la vez mucho más ineficiente, ya que con un RegEx no podrás determinar cua carpeta hace referencia al perfil por defecto, y aparte, el nombre de la carpeta no tiene por que acabar con ".default", mi carpeta de perfil por ejemplo se llama "Elektro" por que así lo especifiqué manualmente en el archivo ini, y creo que lo que tu buscas es eficiencia por que lo usarás en distintos PC's, así que yo te sugiero evitar la metodología del RegEx/patrones por que como ya he dicho usando el patrón de búsqueda "*.default" no resultará siempre, debes leer los valores del archivo INI para averiguar el nombre real de las carpetas de perfiles.

Sin ir más lejos ni siquiera necesitas expresiones regulares suponiendo que en el 90% (por decir algo) de los casos el usuario seguramente solo tendrá una carpeta en el directorio de perfiles, y esa única carpeta será la carpeta de perfil de Firefox, eso es lo más común, pero no muy eficiente en términos de probabilidad, de todas formas te muestro un ejemplo para iterar las carpetas del directorio de perfiles:

Código (vb) [Seleccionar]
Set fso      = CreateObject( "Scripting.FileSystemObject" )  
Set wshShell = CreateObject( "WScript.Shell" )
Set rootDir  = fso.GetFolder( wshShell.ExpandEnvironmentStrings("%AppData%\Mozilla\Firefox\Profiles") )

For Each subDir in rootDir.SubFolders
   Wscript.Echo(subDir.Path)
Next

Wscript.Quit(0)


Saludos








KZN

Me podrías ayudar, intento poner el copyfile pero no me doy cuenta como coger la información del path que has puesto

por cierto no me deja implementar el código GeShi, le doy clic en "Insertar código" y no se me ponen las etiquetas para poder meter cógido dentro

Eleкtro

#8
Cita de: KZN en 30 Enero 2016, 19:14 PMno me doy cuenta como coger la información del path que has puesto

En el primer script, la ruta la tienes disponible en la variable profilePath al finalizar la ejecución del búcle.
Citar
Código (vb,2) [Seleccionar]
...
Wscript.Echo(profilePath)
Wscript.Quit(0)
...


En el segundo script, la ruta la tienes disponible en la propiedad subDir.Path.
Citar
Código (vb,3) [Seleccionar]
...
For Each subDir in rootDir.SubFolders
   Wscript.Echo(subDir.Path)
Next
...




Cita de: KZN en 30 Enero 2016, 19:14 PMintento poner el copyfile

Código (vb) [Seleccionar]
Set FSO = CreateObject("Scripting.FileSystemObject")

sourceDir = ".\" ' Aquí asignas el directorio del perfil de firefox que obtienes en el script.
targetDir = "C:\"
fileExt   = ".png"

Call CopyFilesRecursive(sourceDir, fileExt)
Wscript.Quit(0)


Métodos:
Código (vb) [Seleccionar]
Sub CopyFilesRecursive(sourceDir, fileExt)

    Call CopyFiles(sourceDir, fileExt, targetDir)

    For Each subfolder in FSO.GetFolder(sourceDir).SubFolders
        Call CopyFiles(subfolder.Path, fileExt, targetDir)
        Call CopyFilesRecursive(subfolder, fileExt)
    Next

End Sub

Sub CopyFiles(sourceDir, fileExt, targetDir)
    On Error Resume Next
    Call FSO.CopyFile(sourceDir & "\*" & fileExt, targetDir)
End Sub


Saludos