Windows server 2012 R2 .BAT Programador de Tareas

Porque sería que un .bat que configuro en el programador de tareas no me corre en algunos servidores W Server R2, si el bachero lo ejecuto manualmente (doble click) si funciona.

E nverificado n veces que la configuracion de la tarea esta bien, ¿alguna sugerencia?

copy  C:\2042010254\INFOREST.7z  O:\Restaurantes\1006PardosChorrillos\

1 Respuesta

Respuesta

No he trabajado con el programador de tareas de Windows Server pero imagino que es similar a otros de Windows. Te sugiero que veas si la tarea está creada en el programador y si es así fuerces la ejecución desde el propio programador de tareas. Luego revisa los campos de última ejecución, próxima ejecución y resultado de la ejecución. Por ahí extraerás la información que te permita resolver el problema.

Efectivamente eso hago 

estoy haciendo lo mismo en 28 servidores, pero solo en 9 fallan, pero la configuración es la misma.  y si tienen permisos de red. para hacer el copiado

copy E:\2042010254\INFOREST.7z \172.16.1.9\Autobackups\Restaurantes\2007PlanetSantaAnita\

Pero en los servidores supongo que incluyes el bat que hace el copiado en el "programador de tareas" propio del servidor. Si revisas el programador de tareas de los 9 servidores en los que falla la copia te tiene que indicar si se ejecutó, cuando se ejecutó y el resultado de la ejecución. Y ahí es dónde te debe decir algo que te permita averiguar por qué falló la copia.

También podría ser que programes las tareas de esa copia en un único equipo que se encarga de hacerla en todos los servidores. Si fuera este el caso y se tratara de un único bat que hiciera todas las copias perderías esa información a no ser que dejes las copias que dan el fallo como los últimos comandos de ese bat, porque imagino que si unos comandos dan error y otros no guardará la información del último comando ejecutado. También podrías añadir un archivo de "log" redirigiendo a él la salida de error de los comandos.

En el copy que escribes más arriba está el archivo de origen pero no el de destino. Supongo que el de destino depende del servidor. O tal vez no.

Si concretas algo más como haces las copias creo que podré decirte algo más preciso.

Creía haberte contestado pero no veo la respuesta.

Se me ocurren dos posibilidades:

1. Lanzas con un único bat desde un único equipo las copias de los 28 servidores. En ese caso imagino que el resultado de la ejecución recogerá el resultado de la última copia y si ha sido correcto no te aportará nada. Deberías poner en último lugar los copys de los servidores que dan problemas para ver en el "resultado de la ejecución" el tipo de error que da. O tal vez incluir en cada comando de copy un "desvío" a un archivo de log (por ejemplo "copias.log") de la salida del comando. Luego revisas el archivo de log y verás lo que ocurre en cada caso (si la copia fue bien dirá "1 archivos copiado" y si fue mal el error detectado).

2. Lanzas mediante el "programador de tareas" de cada uno de los 28 servidores el bat que hace la copia. En este caso revisando en el programador de tareas de los servidores que dan fallo el resultado de la ejecución de la tarea que ejecuta el bat deberías ver el error que ha dado. Por cierto, ¿cómo sabes que ha habido copys que han ido mal? Porque ese mismo camino supongo que te aportará las razones del fallo.

Intenta concretar un poco cómo haces las copias y veré si puedo aportar algo.

Ahora he visto que sí que había salido la respuesta. Bueno, así tienes dos por el precio de una ;-)

Y ya he visto que sí que incluías el destino del copy, no me fijé que había un espacio antes del

\172.16.1.9\Autobackups

El resultado que me da el programador de tareas es el siguiente: pero nada que evidencie error no se que hacer :(

y el texto del detalle es el siguiente 

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">

- <System>

<Provider Name="Microsoft-Windows-TaskScheduler" Guid="{DE7B24EA-73C8-4A09-985D-5BDADCFA9017}" />

<EventID>201</EventID>

<Version>1</Version>

<Level>4</Level>

<Task>201</Task>

<Opcode>2</Opcode>

<Keywords>0x8000000000000000</Keywords>

<TimeCreated SystemTime="2016-07-20T11:30:31.259817900Z" />

<EventRecordID>47</EventRecordID>

<Correlation ActivityID="{46AE0FFE-C3A6-4232-A3AC-40E1B7F44C2F}" />

<Execution ProcessID="6828" ThreadID="4544" />

<Channel>Microsoft-Windows-TaskScheduler/Operational</Channel>

<Computer>SRV-PLSTAANITA</Computer>

<Security UserID="S-1-5-21-3153842447-3735115091-3217718590-500" />

</System>

- <EventData Name="ActionSuccess">

  <Data Name="TaskName">\Copiado\bk</Data>

  <Data Name="TaskInstanceId">{46AE0FFE-C3A6-4232-A3AC-40E1B7F44C2F}</Data>

  <Data Name="ActionName">C:\Windows\SYSTEM32\cmd.exe</Data>

<Data Name="ResultCode">1</Data>

</EventData>

</Event>

He buscado el ResultCode 1 en Google y he encontrado esto:

http://www.blogfodder.co.uk/2012/4/20/win-2008-task-scheduler-with-return-code-1-0x1 

Está en inglés pero creo que puede ayudarte.

Esto va por el mismo camino:

http://superuser.com/questions/512642/what-does-return-code-1-mean-for-cmd-exe-on-windows-xp 

En resumen, parece que en lugar de utilizar el path completo para el archivo BAT en la casilla correspondiente al "programa o script" (en la solapa Acciones), utilizando el botón Browse (Examinar) debes poner al nombre del bat en esa casilla y rellenar la casilla "Start in (optional)" (Iniciar en (opcional)) con el path de la carpeta dónde está el bat. Además debes marcar la casilla "Run with highest privileges" (Ejecutar con los privilegios más altos) en la solapa General. Si las cosas son como dicen en esos dos enlaces debería funcionar correctamente. Ya me contarás como te va.

Gracias acabo de realizar lo que me indicó, pero esta igual.

Hice una prueba en vez de copiar el archivo hasta la ruta \\172.16.1.9\Autobackups\Restaurantes\3006PasqualeChorrillos\ solo lo destine a D:\ y si copio... entonces es por la red?, pero hecho lo mismo que en todos y además la ruta destino tiene como permiso y en seguridad habilitado para "todos"

No tienes que cambiar el contenido del bat sino la forma de ejecutarlo desde el programador de tareas.

Perdón, no habia leído el primer párrafo. Olvida mi comentario anterior.

Si la copia en local funciona parece que el problema es que esos servidores no tienen acceso a la red. Prueba a hacer la copia directamente desde CMD, sin usar un bat, a ver que te dice. Imagino que es debido a alguna peculiaridad de la configuración de esos servidores. No por algo relacionado con el usuario ni el destino.

Si lo ejecuto desde cmd o doy doble click al bat si lo copia... ¿entonces no es red..? ¿Permisos a nivel de aplicación..? Que cosa más rara..

¿Has probado a ejecutar la tarea desde el programador de tareas (pinchando sobre ella con el botón derecho y eligiendo "Ejecutar"? Si no lo has hecho hazlo y a ver que pasa. Si ocurre lo mismo que con la ejecución automática yo volvería a revisar lo que te decía en el mensaje del ResultCode porque parecería que es lo que se comentaba en esos enlaces. Copia y pega por aquí las ventanas de la solapa General y de la solapa Acciones/Editar de la tarea (Propiedades)

Hola ya se cual es el error la red no es estable entonces no termina de copiar y por eso no llega, hay forma de decirle al batchero que si no termino de copiar lo intente nuevamente?

Puedes hacerlo controlando el final del comando con ERRORLEVEL. Tendrías que meter los comandos de copia en un bucle parecido a este:

...
:Bucle
Copy origen destino
if errorlevel 1 goto :bucle
...

Pero a veces es complicado meter un bucle dentro de los comandos de un FOR. Si eso te diera problemas concrétame un poco el BAT y veríamos como resolver el asunto.

Hola, este es el bat 

Echo InicioComprimido: %date% %time% >> D:\2042010254\baklog.txt
CD\
"C:\Program Files\7-Zip\7z" a D:\2042010254\INFOREST.7z D:\2042010254\INFOREST.BAK
echo FinComprimido: %date% %time% >> D:\2042010254\baklog.txt
echo Zipeado Correcto, espere mientras se copia el bak a la ruta de destino
Echo InicioCopiado: %date% %time% >> D:\2042010254\baklog.txt
copy D:\2042010254\INFOREST.7z \\172.16.1.9\Autobackups\Restaurantes\1002OrlysParPrimavera
echo FinCopiado: %date% %time% >> D:\2042010254\baklog.txt
echo Proceso Completo
exit

Entiendo, entonces, que no tienes un BAT único para todos los servidores sino uno para cada servidor y este que me pasas es uno de ellos. Si es así este sería el BAT con el control de "copia correcta" y repetición hasta que se haga:

echo InicioComprimido: %date% %time% >> D:\2042010254\baklog.txt
CD\
"C:\Program Files\7-Zip\7z" a D:\2042010254\INFOREST.7z D:\2042010254\INFOREST.BAK
echo FinComprimido: %date% %time% >> D:\2042010254\baklog.txt
echo Zipeado Correcto, espere mientras se copia el bak a la ruta de destino
echo InicioCopiado: %date% %time% >> D:\2042010254\baklog.txt
:BucleCopia
copy D:\2042010254\INFOREST.7z \\172.16.1.9\Autobackups\Restaurantes\1002OrlysParPrimavera
if errorlevel 1 (
echo Error en copia
echo Error en copia, se reintenta >> D:\2042010254\baklog.txt
goto :BucleCopia
)
echo FinCopiado: %date% %time% >> D:\2042010254\baklog.txt
echo Proceso Completo
exit

Prueba a ver si te funciona correctamente, aunque si la red es muy inestable tal vez no lo consiga nunca. Quizás debiéramos añadir un control del número de reintentos, con un máximo establecido.

Si lo que me comentaste me funciona perfecto, pero tienes razón en un caso reintento hasta 5 veces, pero al final lo copió y como le pondría el control mencionado, entiendo que esta es la sintaxis, pero no se como introducirla a mía código: for %A in (uno dos tres cuatro) do ( echo %A)

echo InicioComprimido: %date% %time% >> D:\2042010254\baklog.txt
CD\
"C:\Program Files\7-Zip\7z" a D:\2042010254\INFOREST.7z D:\2042010254\INFOREST.BAK
echo FinComprimido: %date% %time% >> D:\2042010254\baklog.txt
echo Zipeado Correcto, espere mientras se copia el bak a la ruta de destino
echo InicioCopiado: %date% %time% >> D:\2042010254\baklog.txt
:BucleCopia
copy D:\2042010254\INFOREST.7z \\172.16.1.9\Autobackups\Restaurantes\1002OrlysParPrimavera
if errorlevel 1
(
for %A in (echo Error en copia, se reintenta >> D:\2042010254\baklog.txt
goto :BucleCopia,
echo Error en copia, se reintenta >> D:\2042010254\baklog.txt
goto :BucleCopia,
echo Error en copia, se reintenta >> D:\2042010254\baklog.txt
goto :BucleCopia) do (echo %A)
)
echo FinCopiado: %date% %time% >> D:\2042010254\baklog.txt
echo Proceso Completo
exit

Supongo que se puede hacer con un FOR /L %%a (1, 1, 5) etc. para 5 intentos, pero yo prefiero hacerlo como sigue:

echo InicioComprimido: %date% %time% >> D:\2042010254\baklog.txt
set intento=0
set maxintent=5
CD\
"C:\Program Files\7-Zip\7z" a D:\2042010254\INFOREST.7z D:\2042010254\INFOREST.BAK
echo FinComprimido: %date% %time% >> D:\2042010254\baklog.txt
echo Zipeado Correcto, espere mientras se copia el bak a la ruta de destino
echo InicioCopiado: %date% %time% >> D:\2042010254\baklog.txt
:BucleCopia
copy D:\2042010254\INFOREST.7z \\172.16.1.9\Autobackups\Restaurantes\1002OrlysParPrimavera
if errorlevel 1 (
set /a intento=%intento% + 1
if %intento% LEQ %maxintent% (
echo Error en copia. Reintento numero %intento%
echo Error en copia. Reintento numero %intento% >> D:\2042010254\baklog.txt
goto :BucleCopia
)
echo Excedido numero de intentos, copia abortada
echo Excedido numero de intentos, copia abortada >> D:\2042010254\baklog.txt
goto :fin
)
echo FinCopiado: %date% %time% >> D:\2042010254\baklog.txt
echo Proceso Completo
:fin
exit

Prueba y dime como va.

¿En qué quedó esto? ¿Hiciste la prueba? ¿Te has ido de vacaciones y lo has dejado para la vuelta?

¡Gracias! Disculpa estimado, me fue dde maravilla, La red es mala por eso se caía. Muchas Gracias. Saludos desde Perú

Me alegro. Supongo que lo que procede ahora es cerrar la pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas