명령 창에서 배치 파일이 실행되었는지 어떻게 알 수 있나요?

명령 창에서 배치 파일이 실행되었는지 어떻게 알 수 있나요?

Windows 탐색기에서 파일을 두 번 클릭하여 실행하려는 배치 파일이 있습니다. 이 작업이 완료되면 창이 즉시 닫히지 않도록 PAUSE로 끝내고 싶습니다.

그러나 배치 파일이 명령 셸에서 실행되는 경우 PAUSE로 끝나지 않는 것이 좋습니다.

배치 파일 내에서 Windows 탐색기에서 생성된 명령줄에서 실행되고 있는지, 아니면 기존 명령 셸에서 실행되고 있는지 알 수 있는 방법이 있습니까?

Bash는 특별한 $- 환경 변수를 제공합니다.

cmd.exe에 비슷한 것이 있습니까?

답변1

정확한 해결책은 아니지만 cmd 파일에 대한 바로가기를 만들고 대상에 명령줄 매개변수를 추가할 수 있습니다. 탐색기에서 cmd를 실행해야 하는 경우 cmd 파일이 아닌 바로가기를 시작해야 합니다. cmd 파일에서 %1 매개변수를 테스트하여 바로가기(탐색기)에서 시작했는지 명령 프롬프트에서 시작했는지 식별합니다.

답변2

Windows 10에서 Gene의 제안을 시도했습니다.

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

그러나 그것은 나에게 효과가 없었습니다. 그러나 %COMSPEC% 끝에 있는 공백을 제거하면 제대로 작동했습니다.

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

나는 원래 게시물에 대해서만 댓글을 달 것이라는 평판을 갖고 있지 않지만 누군가가 이것을 Gene의 답변에 추가하고 그의 의견을 찬성하는 것을 선호합니다(그가 내 문제를 해결할 수 있는 기초를 제공했기 때문에).

답변3

비슷한 질문에 대한 해결책을 여기에 게시했습니다.886848/창을 만드는 방법-배치-파일-일시 중지-두 번 클릭 시.

해당 솔루션은 귀하에게 효과적이지만 필요한 것보다 조금 더 복잡합니다.

아래에 더 간단하고 효과가 있는 단축 버전을 게시했습니다.

위에 링크된 솔루션에서 자세한 내용을 읽을 수 있지만 기본적으로 %cmdcmdline%배치 파일이 명령 창에서 실행되었는지 여부를 확인하기 위해 환경 변수를 사용한다는 것입니다.

%cmdcmdline%배치 파일이 시작된 방법에 따라 변수의 내용이 다르기 때문에 작동합니다 . 1) Windows 탐색기 또는 데스크탑에서와 같이 배치 파일이나 바로 가기를 클릭하거나 2) 명령 내에서 배치 파일 실행 프롬프트 창.

따라서 다음과 같이 사용합니다.

배치 파일이 종료되는 지점에 다음과 같은 코드를 추가합니다.

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

답변4

주어진 답변 중 어느 것도 모든 경우에 안정적으로 작동하지 않았습니다. 특히 Windows 바로 가기를 통해 데스크톱에서 실행하거나 FreeCommander와 같은 타사 파일 관리자에서 실행할 때 더욱 그렇습니다.

나에게 효과적인 것은 다음과 같습니다.

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
)

관련 정보