Confirmación automática del batch
No se si te acordás de mi, pero una vez me ayudaste con un batch que hacia un backup y verifica los archivos que no habían sido copiados y demás...
-----------------------
Te comento que estaba haciendo un sencillo script donde paraba el motor del sqlserver 2000
El archivo lo único que hace es llamar a estos dos comandos
NET STOP MSSQLSERVER
Pero el problema es que al ejecutarse siempre me pide confirmación si deseo hacerlo o no...
¿La pregunta es..? ¿Hay alguna forma de que a la confirmación la haga de forma automática?
Otra cosa que quería comentarte es que no siempre me pide la confirmación, no se de que depende...
Pero me gustaría saber si esto tiene alguna solución...
Muchas Gracias desde ya
Un Abrazo grande
Diego!
1 Respuesta
Lo cierto es que no tengo ninguna experiencia con el arranque y parada de servicios de red por comando. He estado investigando un poco y haciendo alguna prueba y me da la sensación de que quien te pide conformidad no es el propio comando NET STOP sino el servicio que se intenta detener y lo hace o no lo hace probablemente dependiendo del estado interno en que se encuentre.
A veces se puede "hacer llegar" una respuesta al comando arrancado desde un BAT mediante la "canalización" de entrada. Supongamos que queremos hacer llegar una "Y" a un proceso como el que sugieres. Creamos un archivo YES.TXT, por ejemplo en la carpeta C:\PRUEBA, cuyo único contenido sea la "Y" (o "Yes" si fuera eso lo que espera el comando). Podríamos hacer que el comando recibiera la "Y" de la forma que sigue:
NET STOP MSSQLSERVER < C:\PRUEBA\YES.TXT
A ver si esto te ayuda.
Ya me contarás.
Hola Experto como andas?
Estaba probando el comando un poco ahora que tenia tiempo...
Probé lo que me dijiste y otras cosas mas pero no me ha dado resultado...
Es decir, cuando lo ejecuto me dice que la respuesta no es valida...
Me gustaría saber si realmente le esta llegando algo al comando al momento de leer la entrada del archivo....
Por las dudas te dejo la captura de la prueba...
----------------------------------------------------------------------
C:\Users\Diego\Desktop>NET STOP MSSQLSERVER 0<C:\Confirmación.txt
Los siguientes servicios son dependientes del servicio de MSSQLSERVER.
Detener el servicio de MSSQLSERVER también detendrá estos servicios:
SQLSERVERAGENT
¿Desea continuar esta operación? (S/N) [N]:
No se escribió una respuesta válida.
C:\Users\Diego\Desktop>pause
Presione una tecla para continuar . . .
--------------------------------------------------------------------
Otra cosas rarar que veo es que le asigna un cero antes del signo de asignación..
La verdad que no se porque lo estará haciendo, no creo que se la causa de que no funcione...
Saludos y desde ya muchas gracias...
Diego
El "0" añadido simplemente indica el destino de la redirección y en la de entrada el único razonable es ese valor (0 indica teclado, 1 indica monitor y 2 dispositivo de error, que por defecto también es el monitor). De manera que "0<" indicaría que estamos simulando el teclado con el contenido de lo que venga.
Por tanto el problema debe estar en otro sitio. Se me ocurre que tal vez el archivo "Confirmación.txt" no contiene un salto de línea después del carácter "ES". Mira a ver si la longitud de ese archivo es menor de 5 caracteres (aunque con tres debería bastar es mejor que sea de cinco, con dos saltos de línea en vez de uno solo por si acaso). Si el problema es ese, creo que debería estar esperando antes de emitir el mensaje "No se escribió una respuesta válida" aunque me sorprende que no presente el carácter leído (pero tampoco es imposible que no lo presente). Puedes probar a dar un "Intro" durante la espera, si la hubiera. Tampoco estaría de más que ejecutaras el comando:
TYPE C:\Confirmación.txt
Para ver el contenido del archivo
De momento solo se me ocurre esa explicación. Con lo que me digas ya seguimos investigando.
Respecto a si le está llegando algo al comando o no le está llegando, si las cosas fueran como intuyo si tecleas un "Intro" cuando sale el mensaje "¿Desea continuar esta operación? (S/N) [N]:" debería hacer la parada si le está llegando, mientras que si no llega no debería hacerla, puesto que el valor por defecto es "N".
Hola experto como andas?
No entiendo la parte en la que me decís, "...Mira a ver si la longitud de ese archivo es menor de 5 caracteres (aunque con tres debería bastar es mejor que sea de cinco, con dos saltos de línea en vez de uno solo por si acaso)..."
el contenido del archivo confirmación.txt contiene un solo carácter el cual es "S".
Le he agregado un salto de linea así...
S
echo.
pero tampoco hace nada
Probé con el comando type para ver el contendió del archivo y no le veo nada raro, me muestra lo que tiene realmente, pero nada raro. Creo que el problema tampoco esta acá..
Te comento que cuando lo estaba probando en una de las tantas veces, el bat me corrió sin problemas, pero la verdad que no se porque. Sin haber echo lo del salto y demás...
pensé que esto iba a ser un tramite pero la verdad que no parece que fuera así....
Sigo probando y cualquier cosa te aviso
Saludos
Diego
Hola experto como andas?
No me había percatado de probar el comando dir y verificar la extensión del archivo...
Te muestro la captura de la pantalla pero parece que carece de saltos de lineas.....
-------------------------------------------------------
C:\Users\Diego>dir C:\bat
El volumen de la unidad C no tiene etiqueta.
El número de serie del volumen es: E6E5-3963
Directorio de C:\bat
06/01/2013 05:39 p.m. <DIR> .
06/01/2013 05:39 p.m. <DIR> ..
06/01/2013 05:39 p.m. 1 confirm.txt
1 archivos 1 bytes
2 dirs 739.778.932.736 bytes libres
C:\Users\Diego>
-----------------------------------------------------------
Ayer probando me anduvo por arte de magia sin hacer nada... solo una vez....
La idea de incluirle el archivo con el resultado al comando NET STOP..... es muy buena,
creo que no estamos tan errados,..
lo que no entiendo es porque no me funciona siempre... me baje un libro de batch; si veo algo interesante te aviso...
Un abrazo grande...
Diego
No sé a que te refieres con lo de "incluirle el archivo con el resultado al comando NET STOP". En todo caso creo que debes probar a incluir, al menos, un salto de línea, para lo cual basta con que edites el "confirm.txt", te pongas detrás de la "S" y pulses "Intro" antes de salvar el archivo. Una vez hecho comprueba que la longitud es de 3 (al menos).
A ver si hay suerte.
Saludos,
GGG
<div id="_dyhb23rg4374"> </div>Hola Experto!
Haciendo solamente un dir del directorio donde se encuentra el archivo confirm.txt y sin hacer un salto de linea, el resultado es el que te mostré arriba...
Ahora si le hago un salto de linea como me dijiste anteriormente, el resultado que me arroja es...
-------------------------
Microsoft Windows [Versión 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos.
C:\Users\Diego>dir C:\bat
El volumen de la unidad C no tiene etiqueta.
El número de serie del volumen es: E6E5-3963
Directorio de C:\bat
06/01/2013 05:39 p.m. <DIR> .
06/01/2013 05:39 p.m. <DIR> ..
06/01/2013 06:47 p.m. 3 confirm.txt
1 archivos 3 bytes
2 dirs 739.900.710.912 bytes libres
C:\Users\Diego>
----------------------------------------------------
No se si me exprese bien, cualquiera cosa avisame...
Saludoss!
Supongo que con el confirm.txt de 3 bytes tampoco te funciona correctamente (porque si lo hiciera ya habríamos resuelto el problema). Haz otra prueba con un confirm.txt de dos saltos de línea (5 bytes de longitud) por si acaso.
Y no olvides hacer las pruebas que te comentaba en uno de mis mensajes (por supuesto cuando usas el BAT):
Respecto a si le está llegando algo al comando o no le está llegando,
Si las cosas fueran como intuyo si tecleas un "Intro" cuando sale el
mensaje "¿Desea continuar esta operación? (S/N) [N]:" debería hacer la
Parada si le está llegando, mientras que si no llega no debería hacerla,
Puesto que el valor por defecto es "N".
Si no hay suerte supongo que podremos volver a usar el Teamviewer a ver si se me ocurre algo.
Ya me dirás.
Hola experto como andas?
Antes de contestar la ultima aclaración que me hiciste arriba, te comento...
Hoy probé el bat, solamente con la siguiente linea:
NET STOP MSSQLSERVER
y paro los dos servicios sin problemas y sin pedir confirmación por parte del usuario....
Pero después, te pedía confirmación por parte del usuario...
Es decir que me anduvo una sola vez y por arte de magia...
Lo que me vuelve loco es que no se de que depende que pida la confirmación algunas veces y otras no.....!
Volviendo al ultimo dialogo, te pego por las dudas el resultado de los dos saltos de linea com o me los pediste, pero tampoco tengo resultado positivo...
-----------------------------------------------------------------------------
Microsoft Windows [Versión 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos.
C:\Users\Diego>dir c:\bat
El volumen de la unidad C no tiene etiqueta.
El número de serie del volumen es: E6E5-3963
Directorio de c:\bat
06/01/2013 05:39 p.m. <DIR> .
06/01/2013 05:39 p.m. <DIR> ..
07/01/2013 01:51 p.m. 5 confirm.txt
1 archivos 5 bytes
2 dirs 740.241.530.880 bytes libres
C:\Users\Diego>
---------------------------------------------------------------------------
No entiendo bien lo que me escribiste arriba para que probara...
Es decir, si al momento en que aparece el cuadro de dialogo pidiendo confirmación, apretas la tecla intro, el sistema lo toma como "N": Ya que este esta por defecto...
Tambien probé poniendole una N al archivo, pero tampoco: Me die que la entra no es valida...
Disculpa si no interprete lo que me querias decir, cualquier cosa avisame...
De ultima lo podemos ver por teaviewer. Yo en este momento a las pruebas las hago en W7, pero tambien tengo una maquina virtual con windows Server 2003. Que es realmente el entorno en el que corre el server del negocio....
Pero lo he probado, y obtengo los mismo resultados...
Espero tus comentarios..
Saludos
Diego
Parece que se resiste. En primer lugar no estaría mal saber de que depende que pida o no la confirmación porque tal vez se pudiera preparar el entorno de SQL Server para situarlo en el estado en el que no la pide antes de ejecutar la parada. Pero yo no tengo ni idea de ese entorno y no podría ayudarte.
La otra opción es preparar el comando de parada para que se ejecute cuando pide confirmación, que es lo que estamos intentando. Además serviría también cuando no la pide.
Es este contexto intuyo que el mensaje "No se escribió una respuesta válida" está dando a entender que se recibe algo pero que no es lo que espera. Si ejecutas el comando directamente, sin el BAT, pulsas una tecla cualquiera sin Intro, ¿qué pasa? Si no tecleas nada, ¿tiene alguna temporización o espera indefinidamente? Prueba S mayúscula y minúscula, con y sin Intro. Lo digo porque inicialmente pensaba que podría ser que necesitara el Intro (o salto de línea) y que no estuviera en el archivo de confirmación. En ese sentido sería distinto que hubiera "leído" la "S" y le faltara el Intro, con lo que sí se pulsaba luego el Intro lo interpretaría como una "S", o que no la hubiera leído, con lo que solo leería el Intro y lo interpretaría como una "N". Pero una vez que ya hay cambios de línea en el archivo de confirmación estas matizaciones no aportan gran cosa.
Se me ocurre probar con "s" minúscula aunque el problema puede venir de que se utilice una rutina que lea directamente el teclado en lugar de leer el "buffer de teclado". Es decir que no utilice el servicio del API de acceso al teclado (que a su vez lee el teclado y deja lo leído en el buffer pasando a ASCII los códigos de teclas leídos) sino la propia rutina de diálogo directo con el teclado, para la que no serviría la redirección de la entrada (creo yo)
También se podría probar la redirección de entrada en otro contexto distinto, por si el problema fuera del propio entorno operativo. Por ejemplo probar con:
date < fecha.txt
Y comprobar si cambia a la fecha que se haya escrito en el archivo FECHA.TXT.
En cuanto al Teamviewer yo suelo estar en casa entre las 16:30 y las 21:00 de aquí (ahora son las 14:06).
Ya veríamos como podríamos hacerlo. ¿Tal vez vía Skype ya que el Messenger parece que está eliminado?
He buscado algo en Google sobre el entorno SQL Server de Microsoft y he encontrado esta página. Supongo que la conocerás pero por si ayuda la pongo aquí:
http://msdn.microsoft.com/es-es/library/ms187008(v=sql.105).aspx
A ver si esto ayuda a la primera parte del asunto (evitar que pida la confirmación).
Suerte,
GGG
Ayer leí un poco tu respuesta en Teamviewer pero no la anoté y no me queda más remedio que confiar en la memoria. Me parece que me decías que tenías que detener simultáneamente el Server y el Agent porque si no se hacía así la información de unos archivos era no sé si incorrecta o inaccesible. Pero creo que queda claro que si se detiene el Agent antes de detener el Server nunca pide la confirmación y no se daría el problema de partida. Por lo que leí en la página del enlace que te pasé parece que la secuencia de detención recomendada es, precisamente, esa. De todas formas si crees que la "confirmación automática" te resolvería tus problemas podría hacer alguna otra prueba esta tarde, más o menos a la misma hora de ayer (intentaría que fuera un poco antes para tener algo más de margen).
Para cerrar el asunto voy a resumir lo que hemos estado probando hace un rato.
En primer lugar hemos descartado utilizar la redirección de entrada porque por la razón que sea no parece funcionar correctamente en este caso. Tal vez por lo que decía de que el comando NET STOP no lea el buffer de teclado sino, directamente, el teclado.
Pero se puede conseguir que el NET STOP MSSQLSERVER no pide confirmación sin más que añadirle "/yes" es decir usando el comando:
NET STOP MSSQLSERVER /yes
Por otra parte si se usa un BAT (o CMD) que detenga primero el Agente y luego el Servidor, es decir
NET STOP SQLSERVERAGENT
NET STOP MSSQLSERVER
Se consigue el mismo efecto.
Y eso es todo por el momento.
- Compartir respuesta