batch file - programador - El archivo por lotes se ejecuta correctamente si se hace doble clic pero no se ejecuta en la tarea programada de Windows
programador de tareas windows 10 no funciona (2)
Tengo un archivo archive.pst en mi C: unidad que uso en Outlook para hacer una copia de seguridad de mi correo electrónico. Pero mi C: no está respaldada todas las noches. Así que me gustaría copiar el archivo .pst a mi unidad de red para que siempre se haga una copia de seguridad. No quiero que Outlook abra el archivo .pst directamente desde la unidad de red por una variedad de razones.
Por lo tanto, intento crear una tarea programada que copie mi archivo .pst en una ubicación de red todos los días. El archivo por lotes a continuación funciona perfectamente si se hace doble clic. Si intento ejecutar la tarea programada, solo se crea el archivo de registro. Outlook no se cierra y el archivo .pst no se copia. Intenté ejecutar con los privilegios más altos, pero eso no parece ayudar. Cualquier idea sería apreciada.
cscript.exe close_outlook.vbs
::This is my VBS Script
::Set Outlook = CreateObject("Outlook.Application")
::Outlook.Quit
ping localhost > nul
set idrive="//myserver/drive//Outlook Files/"
set current="C:/myfolder/myuser/Documents/Outlook Files"
echo Start Time of Copy: %time% >> %idrive%/Log.txt
copy %current%/archive.pst %idrive%/archive.pst /y
echo End Time of Copy: %time% >> %idrive%/Log.txt
move %idrive%/Log.txt %idrive%/BackupLogs/Log.txt
ren %idrive%/BackupLogs/Log.txt %date:~10,4%-%date:~4,2%-%date:~7,2%_log.txt
cscript.exe open_outlook.vbs
::This is my VBS Script
::set shell = createobject("wscript.shell")
::shell.run "outlook.exe"
EXIT
Al revisar las respuestas anteriores, he acortado el archivo por lotes solo al siguiente código. Esto funciona al hacer doble clic, pero no al programar una tarea. También probé la misma tarea moviendo el script .vbs a una unidad de red. Mismo resultado.
%SystemRoot%/System32/cscript.exe "C:/OutlookBackup/close_outlook.vbs"
%SystemRoot%/System32/ping.exe -n 4 127.0.0.1>nul
%SystemRoot%/System32/cscript.exe "C:/OutlookBackup/open_outlook.vbs"
1. Especifique todos los archivos en un archivo por lotes ejecutados como tarea programada con ruta completa.
Al hacer doble clic en un archivo de proceso por lotes, generalmente se ejecuta el archivo de proceso por lotes y el directorio de trabajo actual es el directorio del archivo por lotes. Pero cuando se ejecuta un archivo por lotes como tarea programada, el directorio system32 de Windows es el directorio de trabajo actual.
¿Está close_outlook.vbs
y open_outlook.vbs
en el directorio system32 de Windows?
No lo creo. Reemplace en el código del lote debajo de Path to/Script File
dos veces por la ruta correcta.
2. Asigne valores de cadena con espacio a variables de entorno correctas.
variable=value
es el parámetro para el conjunto de comandos. Con
set idrive="//myserver/drive//Outlook Files/"
asigna a la variable idrive
el valor "//myserver/drive//Outlook Files/"
con las comillas dobles incluidas. Esto resulta en la expansión de
echo End Time of Copy: %time% >> %idrive%/Log.txt
en la linea de comando
echo End Time of Copy: 19:21:53 >> 1>"//myserver/drive//Outlook Files/"/Log.txt
y esto no está bien, ¿verdad?
Correcto es:
set "idrive=//myserver/drive/Outlook Files"
También eliminé la segunda barra invertida después de la drive
y la barra invertida al final de la ruta de la carpeta.
Como la variable de entorno contiene ahora la ruta con espacio (s) sin comillas dobles, las comillas dobles deben agregarse cuando el valor de la variable de entorno se utiliza concatenado con un nombre de archivo, vea el código de lote a continuación.
Hay una razón más por la que usar "variable=value"
. Un espacio final no visible al final de la línea con el comando establecido en el archivo por lotes también se agrega al valor de la variable de entorno si las comillas dobles no se usan o se usan incorrectamente. Lea esta respuesta para obtener detalles sobre la asignación correcta de valores de cadena a variables de entorno.
3. Defina el ciclo de espera usando el comando ping mejor.
El comando
ping localhost > nul
produce una espera. Pero es mejor usar algo como
%SystemRoot%/System32/ping.exe -n 4 127.0.0.1>nul
como ahora la espera se determina con exactamente 3 segundos.
4. No inserte un espacio a la izquierda de los operadores de redirección> o >> para stdout.
Por qué esto no debería hacerse fue explicado por mí aquí en detalle.
5. Evite variables de entorno no definidas en el archivo por lotes en sí o en la cuenta del sistema.
Su archivo por lotes utiliza solo variables de entorno definidas en el archivo por lotes. Entonces este consejo aquí no es realmente necesario.
Sin embargo, muchos archivos de proceso por lotes que funcionan bien con doble clic pero no se ejecutan como tarea programada fallan porque el archivo de proceso por lotes depende de variables de entorno como PATH u otras relacionadas con la cuenta de usuario actual. Es seguro usar variables de entorno que existen para todas las cuentas, como SystemRoot .
Código de lote reelaborado
Aquí está su archivo de proceso por lotes con los cambios apropiados según los cuales las rutas de acceso de los dos archivos * .vbs deben configurarse correctamente antes de que el archivo por lotes (con suerte) funcione como tarea programada.
%SystemRoot%/System32/cscript.exe "Path to/Script File/close_outlook.vbs"
%SystemRoot%/System32/ping.exe -n 4 127.0.0.1>nul
set "idrive=//myserver/drive/Outlook Files"
set "current=C:/myfolder/myuser/Documents/Outlook Files"
echo Start Time of Copy: %time%>>"%idrive%/Log.txt"
copy /B /Y /Z "%current%/archive.pst" "%idrive%/archive.pst"
echo End Time of Copy: %time%>>"%idrive%/Log.txt"
move "%idrive%/Log.txt" "%idrive%/BackupLogs/Log.txt"
ren "%idrive%/BackupLogs/Log.txt" %date:~10,4%-%date:~4,2%-%date:~7,2%_log.txt
%SystemRoot%/System32/cscript.exe "Path to/Script File/open_outlook.vbs"
set "idrive="
set "current="