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
)