Como posso saber se um arquivo em lote foi executado em uma janela de comando?

Como posso saber se um arquivo em lote foi executado em uma janela de comando?

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
)

informação relacionada