Autor
|
Tema: [VBS] Iniciación, dudas rutas. (Leído 4,217 veces)
|
KZN
Desconectado
Mensajes: 98
|
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.)
|
|
|
En línea
|
|
|
|
fary
|
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.
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.880
|
yo en Batch usaba esta variable para entrar en la carpeta " cd " Para cambiar el directorio de trabajo actual puedes utilizar la siguiente propiedad: Ejemplo: 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): ExpandEnvironmentStrings("%AppData%\.default")
Saludos
|
|
« Última modificación: 28 Enero 2016, 22:58 pm por Eleкtro »
|
En línea
|
|
|
|
KZN
Desconectado
Mensajes: 98
|
No me e explicado bien, os voy enseñar el código batch para que me entendaís cd Micarpeta\MiSubcarpeta
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 xcopy "*.png" "C:\ProgramData" /Y /I >nul 2 >&1
Y ahora busco hacer lo mismo en VBS e elaborado este pequeño code 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.
|
|
« Última modificación: 29 Enero 2016, 00:55 am por Eleкtro »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.880
|
@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
|
|
« Última modificación: 29 Enero 2016, 01:10 am por Eleкtro »
|
En línea
|
|
|
|
KZN
Desconectado
Mensajes: 98
|
Si, como siempre Elektro me lees la mente, efectivamente, es hay a donde quiero acceder.
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.880
|
Si, 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...: 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: 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
|
|
« Última modificación: 29 Enero 2016, 02:36 am por Eleкtro »
|
En línea
|
|
|
|
KZN
Desconectado
Mensajes: 98
|
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
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.880
|
no 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. ... Wscript.Echo(profilePath) Wscript.Quit(0) ...
En el segundo script, la ruta la tienes disponible en la propiedad subDir.Path. ... For Each subDir in rootDir.SubFolders Wscript.Echo(subDir.Path) Next ...
intento poner el copyfile 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: 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
|
|
« Última modificación: 31 Enero 2016, 08:22 am por Eleкtro »
|
En línea
|
|
|
|
|
|