batch file - ¿Qué se debe tener en cuenta al ejecutar un archivo por lotes como tarea programada?
batch-file scheduled-tasks (1)
El uso de un archivo por lotes con una sola línea de comando como tarea programada generalmente no tiene mucho sentido.
Sería mejor especificar directamente en el trabajo programado para ejecutar la aplicación ejecutada por el archivo por lotes con sus parámetros que serían en este caso
%SystemRoot%/System32/wscript.exe
con el parámetro
"C:/myfolder/myscript.vbs"
.
Al usar solo aplicaciones de consola, sería mejor usar
cscript
, la versión de consola de Windows Script Host, en lugar de
wscript
, la versión de Windows GUI de Windows Script Host.
La ayuda en ambas aplicaciones se muestra al ejecutarse en una ventana de símbolo del sistema
cscript /?
con salida de ayuda directamente en la ventana de la consola y
wscript /?
con la ayuda que se muestra en una ventana GUI.
Se deben tener en cuenta al menos 4 puntos al ejecutar algo como tarea programada:
-
La cuenta de usuario configurada en las propiedades de la tarea programada.
La cuenta utilizada determina los permisos en el disco local, así como en los recursos compartidos de red. Por ejemplo, el administrador local o la cuenta del sistema generalmente no tienen permisos de acceso en ningún recurso en una red local, pero tienen acceso completo a cualquier directorio en unidades locales. También define las variables de entorno disponibles y todas las configuraciones dependientes de la región y el idioma, como el formato de fecha y hora para los comandos dedate
ytime
y las variables de entorno integradas FECHA y HORA . -
El directorio de trabajo actual establecido al iniciar la tarea programada.
El directorio predeterminado al iniciar una tarea programada es%SystemRoot%/System32
si no hay otra carpeta configurada en las propiedades de la tarea programada para usar como inicio en la carpeta. Al hacer doble clic en un archivo por lotes en una unidad con una letra de unidad, el directorio del archivo por lotes es el directorio de trabajo actual. Cualquier secuencia de comandos ejecutada por el archivo por lotes debe tener eso en cuenta. Lo mejor es escribir el script para ser independiente en el directorio actual. -
El entorno definido para la tarea programada depende de la cuenta utilizada.
Se utilizan variables de entorno del sistema para todas las cuentas de usuario y variables de entorno relacionadas con la cuenta de usuario. Al ejecutar una tarea programada con una cuenta de usuario diferente, como el administrador local o la cuenta del sistema, no se pudieron definir algunas variables de entorno que se definen al ejecutar el mismo script con una cuenta de usuario propia. Es recomendable hacer que los scripts ejecutados como tarea programada sean lo más independientes posible de las variables de entorno, con la excepción de las variables del sistema definidas por Windows automáticamente comoSystemRoot
. El artículo de Wikipedia Variables de entorno de Windows enumera y describe las variables de entorno definidas por Windows. -
Los recursos compartidos de red conectados como unidades de red a menudo no están disponibles al ejecutar una tarea programada.
Windows almacena en el registro del usuario actual qué recurso compartido de red está conectado de forma permanente como unidad de red. Esos recursos compartidos de red están conectados (asignados a una letra de unidad) cuando el usuario inicia sesión y se desconectan automáticamente cuando el usuario cierra sesión. La ejecución de un script como tarea programada con una cuenta diferente a la cuenta propia hace que las unidades de red no estén disponibles para el script porque ni el recurso compartido de red está conectado como unidad de red ni la otra cuenta tiene más probabilidades de acceder a los recursos de la red. E incluso cuando se ha configurado en las propiedades de la tarea programada para usar la cuenta de usuario propia, las unidades de red no están disponibles, ya que no hay inicio de sesión antes de ejecutar la tarea programada, excepto que la tarea programada está configurada para ejecutarse solo cuando el usuario ha iniciado sesión.
La solución está utilizando rutas de guión UNC y una cuenta con los permisos de acceso necesarios en el recurso de red o mapa, por ejemplo con
net use X: //ComputerName/ShareName password /user:DomainName/AccountName /persistent:no
el recurso compartido para conducirX:
y desconecte antes de salir de la ejecución del script con
net use X: /delete
Ejecutar en una ventana de símbolo del sistemanet use /?
para ayuda en este comando.
Al usar para la tarea programada una cuenta con permisos de acceso en la red compartida, no es necesario especificar la contraseña y el nombre de la cuenta en el script (por lotes), que es mucho más seguro, de lo contrario, todos los que tengan acceso de lectura al archivo de script pueden ver el no cifrado contraseña y nombre de cuenta. Windows almacena las credenciales de la tarea programada encriptada.
Por lo tanto, el VBScript funciona bien en la ejecución manual con la cuenta de usuario actual con el directorio actual como el directorio del archivo por lotes con las variables de entorno definidas para la cuenta de usuario actual y quizás con las unidades de red conectadas a las que accede el script y las aplicaciones llamadas por el script deben ser investigado para encontrar la razón por la cual el script no funciona como tarea programada con las propiedades configuradas para la tarea programada.
Tengo una tarea programada que se está ejecutando , pero no parece estar funcionando. Esta tarea ejecuta un archivo por lotes. El archivo por lotes contiene solo una línea:
wscript c:/myfolder/myscript.vbs
Este archivo VBScript inicia un símbolo del sistema, ejecuta
vpncli
, duerme un minuto y luego configura una conexión que envía el nombre de usuario / contraseña a la ventana de la línea de comandos.
Esto funciona bien cuando se ejecuta el archivo por lotes desde una ventana del símbolo del sistema, pero no funciona correctamente con la tarea programada.
La cuenta en la que ejecuta la tarea es una cuenta administrada por el servicio.
Después de ejecutar la tarea,
vpncli
en una ventana de línea de comando separada
vpncli
, y veo que la conexión todavía está desconectada.
¿Qué se debe tener en cuenta al ejecutar un archivo por lotes en una tarea programada para resolver este problema?
A continuación se muestra parte del código que estoy usando para ejecutar en un shell CMD. Se ejecuta la siguiente subrutina:
Sub VPN_open
VPN_Profile = "vpn.myhost.com"
VPN_User = "USERNAME"
'' If the password contains special characters, enclose the characters in curly braces {}.
VPN_Password = "PASSWORD"
oShell.Run "cmd"
WScript.Sleep 100
oShell.AppActivate "C:/Windows/System32/cmd.exe"
oShell.SendKeys "vpncli connect " & VPN_Profile & "~"
WScript.Sleep 10000
oShell.SendKeys VPN_User & "~"
WScript.Sleep 5000
oShell.SendKeys VPN_Password & "~"
WScript.Sleep 10000
oShell.SendKeys "exit~"
End Sub ''VPN_open