update una proceso pausar marcha las esta detienen detener descargando descarga como cancelar actualizaciones actualizacion windows batch-file

una - pausar actualizaciones windows 10



¿Pausar un archivo por lotes cuando se hace doble clic pero no cuando se ejecuta desde una ventana de consola? (4)

Un enfoque podría ser crear un archivo autoexec.nt en la raíz de c: / que se parece a algo como:

@set nested=%nested%Z

En su archivo por lotes, verifique si% anidado% es "Z"; si es "Z", entonces ha hecho doble clic, así que haga una pausa. Si no es "Z", será "ZZ" o "ZZZ", etc., ya que CMD hereda el bloque de entorno del proceso principal.

-Oisin

¿Hay alguna forma de que un archivo por lotes (en este caso, ejecutarse en Windows XP) determine si se inició desde una línea de comandos (es decir, dentro de una ventana de consola) o si se inició mediante el shell (por ejemplo, haciendo doble clic)?

Tengo un script que me gustaría hacer una pausa en ciertos puntos cuando se ejecuta a través del shell, pero no cuando se ejecuta en una línea de comandos. He visto una pregunta similar sobre SO, pero no puedo usar la misma solución por dos razones: primero, si se detiene o no, depende de múltiples factores, solo uno de ellos es si se hizo doble clic. En segundo lugar, distribuiré este script a otros en mi equipo y no puedo pedirles a todos de manera realista que realicen cambios en el registro que afectarán a todos los scripts.

es posible?


Un poco más de información ...

Comienzo con un archivo por lotes (test.cmd) que contiene:

@echo %cmdcmdline%

Si hago doble clic en el archivo por lotes "test.cmd" desde el Explorador de Windows, la pantalla de echo% cmdcmdline% es:

cmd /c ""D:/Path/test.cmd" "

Al ejecutar el archivo por lotes "test.cmd" desde una ventana del símbolo del sistema, la pantalla de
echo% cmdcmdline% depende de cómo se inició la ventana de comandos ...

Si comienzo "cmd.exe" haciendo clic en "Start-Orb" y "Símbolo del sistema" o si hago clic en "Start-Orb" y ejecuto "cmd.exe" desde el cuadro de búsqueda / ejecución. Luego ejecuto el archivo por lotes "test.cmd", la pantalla de echo% cmdcmdline% es:

"C:/Windows/system32/cmd.exe"

Además, para mí, si hago clic en "Símbolo del sistema" desde el acceso directo del escritorio, luego ejecuto el archivo por lotes "test.cmd", la pantalla de echo% cmdcmdline% también es:

"C:/Windows/system32/cmd.exe"

Pero, si hago "clic derecho" dentro de una ventana del Explorador de Windows y selecciono "Abrir el símbolo del sistema aquí", luego ejecuto el archivo por lotes "test.cmd", la pantalla de echo% cmdcmdline% es:

"C:/Windows/System32/cmd.exe" /k ver

Entonces, solo tenga cuidado, si inicia "cmd.exe" desde un acceso directo que contiene una "/ c" en el campo "Destino" (poco probable), entonces la prueba en el ejemplo anterior no probará este caso correctamente.


Una respuesta consolidada, derivada de gran parte de la información que se encuentra en esta página (y algunas otras páginas de desbordamiento de pila con preguntas similares). Este no se basa en la detección de / c, pero en realidad busca el nombre del script en la línea de comandos. Como resultado, esta solución no se detendrá si hace doble clic en otro lote y luego llama a este; tenías que hacer doble clic en este archivo por lotes en particular.

:pauseIfDoubleClicked setlocal enabledelayedexpansion set testl=%cmdcmdline:"=% set testr=!testl:%~nx0=! if not "%testl%" == "%testr%" pause

  1. La variable "testl" obtiene la línea completa de la llamada del procesador cmd, eliminando todas las comillas dobles molestas.
  2. La variable "testr" toma "testl" y además elimina el nombre del nombre del archivo de lote actual si está presente (que será si el archivo de lote se invocó con un doble clic).
  3. La instrucción if ve si "testl" y "testr" son diferentes. Si es así, se hizo doble clic en el lote, así que haga una pausa; si no, se escribió batch en la línea de comando (o se llamó desde otro archivo batch), continúe.

Edición: Lo mismo se puede hacer en una sola línea:

echo %cmdcmdline% | findstr /i /c:"%~nx0" && set standalone=1

En un lenguaje sencillo, este

  • canaliza el valor de %cmdcmdline% a findstr , que luego busca el nombre del script actual
  • %0 contiene el nombre del script actual, por supuesto solo si shift no se ha llamado de antemano
  • %~nx0 extrae el nombre de archivo y la extensión de %0
  • >NUL 2>&1 silencia el buscador al redireccionar cualquier salida a NUL
  • findstr establece un nivel de error distinto de cero si no puede encontrar la subcadena en cuestión
  • && solo se ejecuta si el comando anterior regresó sin error
  • como consecuencia, la función standalone no se definirá si el script se inició desde la línea de comandos

Más adelante en el guión podemos hacer:

if defined standalone pause


Encontré uno :-) - Después de pensar desesperadamente qué podría hacer cmd cuando se ejecuta de manera interactiva, pero no cuando se ejecuta un archivo por lotes directamente ... finalmente encontré uno.

La pseudo-variable %cmdcmdline% contiene la línea de comando que se utilizó para iniciar cmd . En caso de que cmd se haya iniciado normalmente, este contiene algo similar a lo siguiente:

"C:/Windows/System32/cmd.exe"

Sin embargo, al lanzar un archivo por lotes se ve así:

cmd /c ""C:/Users/Me/test.cmd" "

Pequeña demo:

@echo off for %%x in (%cmdcmdline%) do if /i "%%~x"=="/c" set DOUBLECLICKED=1 if defined DOUBLECLICKED pause

Sin embargo, esta forma de verificación podría no ser la más robusta, pero /c solo debería estar presente como un argumento si un archivo de proceso por lotes se inició directamente.

Funciona en mi máquina http://hypftier.de/dump/works_on_my_machine.png

Probado aquí en Windows 7 x64. Puede o no funcionar, romperse, hacer algo raro, comer niños (podría ser algo bueno) o morderte la nariz.