¿Cómo puedo saber si se ejecutó un archivo por lotes desde una ventana de comandos?

¿Cómo puedo saber si se ejecutó un archivo por lotes desde una ventana de comandos?

Tengo un archivo por lotes que me gustaría poder ejecutar haciendo doble clic en el archivo en el Explorador de Windows. Cuando termine esto, quiero finalizar con una PAUSA para que la ventana no se cierre inmediatamente.

Pero si el archivo por lotes se ejecuta desde un shell de comandos, preferiría no terminar con una PAUSA.

¿Hay alguna forma de saber, dentro de un archivo por lotes, si se está ejecutando en una línea de comandos generada desde el Explorador de Windows o desde un shell de comandos existente?

Bash proporciona la variable de entorno especial $-.

¿Hay algo similar en cmd.exe?

Respuesta1

No es una solución exacta, pero puede crear un acceso directo a su archivo cmd y agregar un parámetro de línea de comando al destino. Cuando necesites ejecutar tu cmd desde Explorer, tendrás que iniciar el acceso directo, no el archivo cmd. En su archivo cmd probará el parámetro %1 para identificar si se inició desde un acceso directo (desde el explorador) o desde el símbolo del sistema.

Respuesta2

Probé la sugerencia de Gene en Windows 10:

if /I Not "%CMDCMDLINE:"=%" == "%COMSPEC% " Pause

Pero eso no funcionó para mí. SIN EMBARGO, cuando eliminé el espacio al final de %COMSPEC%, funcionó:

if /I Not "%CMDCMDLINE:"=%" == "%COMSPEC%" Pause

No tengo la reputación de simplemente comentar la publicación original, pero preferiría que alguien agregara esto a la respuesta de Gene y votara a favor de la suya (ya que él me dio la base para resolver mi problema).

Respuesta3

Publiqué una solución a una pregunta similar aquí:886848/cómo-hacer-pausar-archivos-por-lotes-de-windows-cuando-se-hace doble clic.

Esa solución debería funcionar para usted, pero es un poco más complicada de lo que probablemente necesite.

Publiqué una versión abreviada a continuación, que es más simple y debería funcionar para usted.

Puede leer más al respecto en la solución vinculada anteriormente, pero lo básico es que utiliza la variable de entorno: %cmdcmdline%para determinar si el archivo por lotes se ejecutó desde una ventana de comandos o no.

Funciona porque el contenido de la variable %cmdcmdline%es diferente según cómo se inició el archivo por lotes: 1) Al hacer clic en un archivo por lotes o acceso directo, como desde el Explorador de Windows o en el escritorio, o 2) Ejecutar el archivo por lotes desde un comando Ventana de aviso.

Entonces, lo usas así:

En el punto donde saldrá el archivo por lotes, agregue un código como este:

set newcmdcmdline=%cmdcmdline:"=-%
echo %newcmdcmdline% | find /i "cmd /c --%~dpf0%-"
set "result=%errorlevel%"

rem if %result% EQU 0 
rem     this batch file was executed by clicking a batch file 
rem     or a shortcut to a batch file, typically from Windows Explorer 
rem     or the Desktop, or the "Start Menu" ...

rem if %result% NEQ 0 
rem     this batch file was executed from within a Command Prompt

rem if executed from within a Command Prompt: 
rem     go exit the batch script immediately, without pausing. 
rem     since this batch file was executed from within a 
rem     Command Prompt, the command window will remain open. 
rem     You can use either of these to exit the batch file:
rem          goto :EOF
rem          exit /b

if %result% NEQ 0 goto :EOF

rem at this point, we know this batch file was executed by clicking ..., 
rem     NOT from within a Command Prompt. 

rem leave the command prompt window open to allow the user time to 
rem    view the messages on the screen before exiting. Use any of 
rem    these to pause and or interact with the user before exiting: 
rem        pause
rem        echo Message... &pause
rem        set /p "d=Message..."
rem        choice [Options...]
rem            (choice /? Displays help message for the Choice command)
rem        timeout /T wait-time [Options...]
rem            (timeout /? Displays help message for the Timeout command)

timeout /t 10
goto :EOF

Respuesta4

Ninguna de las respuestas dadas funcionó de manera confiable para mí en todos los casos, especialmente cuando se inicia desde el escritorio a través de un acceso directo de Windows o desde un administrador de archivos de terceros, por ejemplo, FreeCommander.

Lo que me funciona es esto:

if "%CMDCMDLINE:"=%" == "%COMSPEC%" (
  REM started via windows explorer
) else if "%CMDCMDLINE%" == "cmd.exe" (
  REM started via file manager (e.g. FreeCommander)
) else if "%CMDCMDLINE:"=%" == "%COMSPEC% /c %~dpf0 " (
  REM started in command window
) else (
  REM started from other batch file
)

información relacionada