Alberto Robledo Cotrina – Windows Tools and Tips

Consejos y Herramientas sobre Tecnologías Microsoft

Archivos de la categoría ‘VBS’

Gestión de Salida en Scripts VBS (StdOut) y PSExec 1.72+

Publicado por Alberto Robledo en Noviembre 7, 2008

Imagino que en alguna ocasión os habréis encontrado con la necesidad de diseñar Scripts que ejecutan una serie de comandos y gestionan su salida.

En primer lugar, y para ejecutar un comando desde un script VBS se precisa generar un objeto de Shell y otro de Ejecución. Por ejemplo, las siguientes líneas efectúan un IPConfig:

  • strCmd = “C:\Windows\System32\IPConfig.exe /all”
  • set objShell = CreateObject (“Wscript.Shell”)
  • set objExec = objShell.Exec(strCmd)

Una vez ejecutada la tercera línea, se puede gestionar cada una de las líneas de la salida del comando anterior, por ejemplo, mediante un bucle While:

  • While Not objExec.StdOut.AtEndOfStream
    • strLine = objExec.StdOut.ReadLine
  • Wend

En el ejemplo anterior se puede trabajar perfectamente con el contenido de cada línea para tratar de localizar cualquier cadena de texto a tratar posteriormente (siguiendo con el ejemplo anterior, se puede detectar la dirección MAC de una tarjeta que disponga de una IP concreta).

Ahora bien… ¿que ocurre con la utilidad PSExec? ¿También permite redirigir su salida como cualquier otro comando?

Desafortunadamente, a partir de la versión 1.72, esto no es así… ya que Microsoft rediseñó dicha utilidad para solventar otros problemas. Por tanto, a raiz de dicha modificación, ya no es posible gestionar la salida StdOut del objeto de ejecución PSExec…

Ahora bien, si aún tenéis la necesidad de ejecutar desde VBS un comando en remoto y tratar su salida debidamente… ¿cual sería la solución?

Lamentablemente la solución pasa por hacer uso del método objShell.Run redirigiendo la salida del comando hacia un fichero de texto, y abriendo el fichero a posteriori para tratar su contenido. En nuestro ejemplo anterior las líneas a ejecutar serían las siguientes:

strCmd = “C:\Temp\PsTools\PSexec.exe \\%Computername% C:\Windows\System32\ipconfig.exe /all > C:\Temp\IPResult.txt”
Set objShell = CreateObject (“Wscript.Shell”)
set objFso = CreateObject (“Scripting.FileSystemObject”)

objShell.Run(strCmd)

Wscript.Sleep 2000

set objFile = objFso.OpenTextFile(“C:\Temp\IPResult.txt”)

While Not objFile.AtEndOfStream
    strLine = objFile.ReadLine
Wend

De este modo se puede generar un script que ejecute cierto comando en remoto (cambiando el nombre de equipo), y volcar la salida a un fichero para tratarla posteriormente de modo oportuno.

Un saludo,

Alberto Robledo

Publicado en Gestion de Salida, PSExec, Scripts, VBS, objShell.Exec, objShell.Run | Deja un Comentario »

Ejecucion de NTBackup desde Script con una Lista de Selección de Archivos y/o Carpetas

Publicado por Alberto Robledo en Noviembre 6, 2008

¿Habéis tenido alguna vez la necesidad de efectuar backups desde la línea de comandos o desde un script?

Cada gestor de backup tiene sus propios métodos… y NTBackup no podía ser menos. Éste permite generar un fichero de lista de selección con extensión BKS en el que se le indicarán, línea por línea, los ficheros o las carpetas a ser respaldados. Ahora bien, tiene truco… ya que el formato de fichero es Unicode.

La sintaxis de NTBackup es la siguiente:

  • NTBackup Backup @”Fichero de Seleccion.BKS” /M “Tipo de Backup” /J “Nombre de Trabajo” /F “Fichero Destino.BKF” /D “Descripción del Backup” /N “Nombre del Dispositivo” /V:YES /R:NO /L:f /RS:NO /HC:ON

Si queréis obtener más información sobre cada uno de los parámetros, podéis consultar la ayuda de NTBackup mediante el comando NTBackup /? (no tiene misterio alguno).

Ahora bien, se debe tener en cuenta que el fichero BKS debe ser generado en formato Unicode. Para ello existen, entre otros, dos modos sencillos de generar este fichero correctamente:

  • Generando el fichero de modo manual desde el Bloc de Notas, y guardando el fichero en formato Unicode (Encoding –> Unicode), y
  • Generando el fichero de modo automático desde un script, generando un fichero de texto de tipo Unicode.

Desde el Bloc de Notas no tiene ninguna complicación… y “el secreto” reside en generar el fichero en modo Unicode. Si os fijáis, la sintaxis del método CreateTextFile es la siguiente:

  • object.CreateTextFile(filename[, overwrite[, unicode]])

 El tercer parámetro de dicho método, cuando se habilita (True), guarda el fichero en formato Unicode… con lo que NTBackup será capaz de interpretar un fichero de selección generado de este modo.

Por ejemplo, un script que respalde de modo normal el directorio C:\Backup Folder, contendría lo siguiente:

Set fso = CreateObject(“Scripting.FileSystemObject”)
set ObjShell = CreateObject(“Wscript.Shell”)

strDestFolder    = “C:\Dest Folder”
strBackupFolder  = “C:\Backup Folder”
strBackupFile    = strDestFolder & “\Backup File.BKF”
strSelectionFile = strDestFolder & “\Selection File.BKS”

set objSelectionFile = fso.CreateTextFile(strSelectionFile,,True) ‘NOTA: Unicode = TRUE

objSelectionFile.WriteLine (strBackupFolder)

strNTBackupCmd = “NTBackup Backup ” & Chr(34) & “@” & strSelectionFile & chr(34) & ” /M Normal ” & _
               ” /J ” & chr(34) & “Backup Job Name ” & chr(34) & _
               ” /F ” & chr(34) & strBackupFile & chr(34) & _
               ” /D ” & chr(34) & “Backup Description” & chr(34) & _
               ” /N ” & chr(34) & “Backup Device Name ” & chr(34) & _
               ” /V:YES /R:NO /L:f /RS:NO /HC:ON”

‘  Wscript.Echo strNTBackupCmd

set objNTBackupCmd = Wscript.Exec(strNTBackupCMD)

Lo mejor de todo esto es que el contenido del fichero de selección, al ser generado desde un script, puede adaptarse a cualquier necesidad (por ejemplo, respaldando ficheros o carpetas generados en una fecha concreta).

Un saludo,

Alberto Robledo.

Publicado en Lista de Seleccion, NTBackup, Scripts, Unicode, VBS | 1 comentario