Eu tenho um arquivo em lote que gostaria de poder executar clicando duas vezes no arquivo no Windows Explorer. Quando isso for feito, quero terminar com uma PAUSA para que a janela não feche imediatamente.
Mas se o arquivo em lote for executado a partir de um shell de comando, prefiro não terminar com PAUSE.
Existe alguma maneira de saber, dentro de um arquivo em lote, se ele está sendo executado em uma linha de comando gerada no Windows Explorer ou em um shell de comando existente?
Bash fornece a variável de ambiente especial $-.
Existe algo semelhante no cmd.exe?
Responder1
Não é uma solução exata, mas você pode criar um atalho para o arquivo cmd e adicionar um parâmetro de linha de comando ao destino. Quando precisar executar o cmd no Explorer, você terá que iniciar o atalho, não o arquivo cmd. No seu arquivo cmd você testará o parâmetro% 1 para identificar se ele foi iniciado a partir do atalho (do explorer) ou do prompt de comando.
Responder2
Tentei a sugestão de Gene no Windows 10:
if /I Not "%CMDCMDLINE:"=%" == "%COMSPEC% " Pause
Mas isso não funcionou para mim. NO ENTANTO, quando removi o espaço no final de% COMSPEC%, funcionou:
if /I Not "%CMDCMDLINE:"=%" == "%COMSPEC%" Pause
Não tenho reputação de apenas comentar a postagem original, mas preferiria que alguém adicionasse isso à resposta de Gene e votasse a favor da dele (já que ele me deu a base para resolver meu problema).
Responder3
Postei uma solução para uma pergunta semelhante aqui:886848/how-to-make-windows-batch-file-pause-when-double-clicked.
Essa solução deve funcionar para você, mas é um pouco mais complicada do que você provavelmente precisa.
Postei uma versão resumida abaixo, que é mais simples e deve funcionar para você.
Você pode ler mais sobre isso na solução vinculada acima, mas o básico é que ele usa a variável de ambiente: %cmdcmdline%
para determinar se o arquivo em lote foi executado a partir de uma janela de comando ou não.
Funciona porque o conteúdo da variável %cmdcmdline%
é diferente dependendo de como o arquivo em lote foi iniciado: 1) Ao clicar em um arquivo em lote ou atalho, como no Windows Explorer ou na área de trabalho, ou 2) Executando o arquivo em lote a partir de um comando Janela de prompt.
Então você usa assim:
No ponto onde o arquivo em lote será encerrado, você adiciona um 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
Responder4
Nenhuma das respostas fornecidas funcionou de maneira confiável para mim em todos os casos, especialmente quando iniciada na área de trabalho por meio de um atalho do Windows ou de um gerenciador de arquivos de terceiros, por exemplo, FreeCommander
O que funciona para mim é isto:
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
)