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.)
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.
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:
- CurrentDirectory Property - MSDN (https://msdn.microsoft.com/en-us/library/3cc5edzd%28v=vs.84%29.aspx)
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
No me e explicado bien, os voy enseñar el código batch para que me entendaís
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
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.
@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
Si, como siempre Elektro me lees la mente, efectivamente, es hay a donde quiero acceder.
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...:
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
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
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...
Wscript.Echo(profilePath)
Wscript.Quit(0)
...
En el segundo script, la ruta la tienes disponible en la propiedad
subDir.Path.
Citar...
For Each subDir in rootDir.SubFolders
Wscript.Echo(subDir.Path)
Next
...
Cita de: KZN en 30 Enero 2016, 19:14 PMintento 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