dimecres, 20 de gener del 2016

Error 0x1 en el Programador de Tareas al ejecutar scripts .bat con accesos UNC

En Windows, en ocasiones algunos scripts batch pueden fallar en el Scheduler Task (error 0x1) al acceder por UNC a recursos compartidos (\\).

Una de las ocasiones en que este error se produce es al utilizar estos accesos en el comando forfiles (explicado en el anterior post).
Curiosamente, al ejecutar estos mismos scripts manualmente, sin el Programador de Tareas, funcionan perfectamente.

Una de las formas de solucionar rápidamente este problema es utilizando los comandos pushd y popd en el script.

Con pushd almacenamos una ruta en memoria. 
Si la ruta utiliza acceso UNC, pushd crea una unidad de red en el sistema empezando por la letra Z: (si está libre):

pushd \\servidor\unidad$\carpeta

En este ejemplo, pushd asigna a la unidad Z: la ruta \\servidor\unidad$\carpeta , con lo que en el script ya no será necesario usar forfiles con la ruta UNC y emplearemos Z: en su lugar:

forfiles /p "Z:" …

Una vez ya no se necesite más el acceso a este recurso en el script, lo liberaremos con el comando popd (se usa sin parámetros).

- si necesitamos asignar más rutas UNC dentro del mismo script, pushd irá asignando letras de unidad en orden alfabético inverso. 
- al terminar, tendremos que ejecutar tantos popd como pushd hayamos hecho en el script. 
- popd “desmonta” los pushd empezando por el último que se ha ejecutado.

Lo vemos en este .bat de ejemplo:

REM este pushd asigna la siguiente ruta a Z:
pushd \\servidor\unidad$\carpeta 

REM este pushd asigna la siguiente ruta a Y:

pushd \\servidor\unidad$\carpeta2

forfiles /p "Z:” …

forfiles /p "Y:” …

REM este popd libera la unidad Y:

popd
REM este popd libera la unidad Z:
popd

dimecres, 13 de gener del 2016

Forfiles: ejecutar comandos de Windows sobre varios ficheros seleccionados

Una de las tareas que nos puede tocar hacer como administradores de sistemas Windows es borrar de manera automatizada archivos más antiguos de X tiempo. Por ejemplo, un programa que cree diariamente archivos de registro o logs pesados, que tan solo necesitemos guardarlos durante un tiempo concreto.

Para realizar esta tarea diariamente sin necesidad de programar un script, tenemos el comando forfiles:

forfiles [/p <Path>] [/m <SearchMask>] [/s] [/d [{+ |-}] [{<Date> | <Days>}]] [/ c "<Command>"] 



Éste es el aspecto que tendria el comando si queremos borrar todos los archivos .log de la carpeta c:\logsprogram , cuya fecha de modificación sea mayor de 90 días:

forfiles  /p "c:\logsprogram"  /m *.log  /s  /d -90  /c "cmd /c echo El archivo @PATH modificado el @fdate ha sido borrado & del @PATH" >>del_logs.txt

- El parámetro /s indica que la tarea debe realizarse en todas las subcarpetas de la carpeta indicada
- Con el parámetro /d especificamos una fecha o un número de días a contar desde la fecha actual. En el ejemplo, /d -90 selecciona los archivos cuya fecha de modificación sea anterior o igual a 90 días desde la fecha actual
- Dentro del parámetro /c escribimos el comando a ejecutar con los archivos que se han seleccionado. En ese caso el comando es "del @PATH", donde la variable de entorno @PATH contiene la ruta de cada fichero que selecciona forfiles.
- Con el símbolo "&" podemos concatenar texto con el comando para posteriormente redirigir la salida a un fichero .txt y tener un registro de las acciones que ha realizado forfiles

Este comando lo ejecutamos dentro de un archivo .bat programado en el Task Scheduler, y ya tendremos el borrado automático.

Más información en la página de Microsoft:

https://technet.microsoft.com/es-es/library/cc753551%28v=ws.10%29.aspx

dissabte, 9 de gener del 2016

Hello World!

Hola! mi nombre es Javier, soy administrador de sistemas, y en este blog iré apuntando todo aquello que considere interesante o de ayuda para sysadmins :)

Asi que sin mas preámbulos, comienzo!