2012-02-23 9 views
17

Me gusta tener una línea típica de "uso:" en mis scripts cmd.exe — si falta un parámetro, al usuario se le da un simple recordatorio de cómo se usará el script.Determinar si la secuencia de comandos por lotes se ha iniciado/ejecutado desde la línea de comandos (cmd) -o bien - ¿Pausar o no pausar?

El problema es que no puedo predecir con seguridad si el usuario potencial usaría GUI o CLI. Si alguien que usa la GUI hace doble clic en esta secuencia de comandos en la ventana del Explorador, no tendrán la oportunidad de leer nada, a menos que yo pause la ventana. Si usan CLI, pause les molestará.

Así que estoy buscando una manera de detectarlo.

@echo off 
if _%1_==__ (
    echo usage: %nx0: filename 
    rem now pause or not to pause? 
) 

¿Hay una buena solución para esto?

Respuesta

13

Puede comprobar el valor de %CMDCMDLINE% variable. Contiene el comando que se utilizó para iniciar cmd.exe.

me preparó una prueba archivo .bat:

@Echo Off 
echo %CMDCMDLINE% 
pause 

cuando se ejecuta desde el interior de la ventana abierta cmd.exe, el script muestra "C:\Windows\system32\cmd.exe". Cuando se ejecuta haciendo doble clic, imprime cmd /c ""C:\Users\mbu\Desktop\test.bat" "

Así que para comprobar si el script se puso en marcha haciendo doble clic es necesario comprobar si %cmdcmdline% contiene la ruta al script. La solución final se vería así:

@echo off 

set interactive=1 
echo %cmdcmdline% | find /i "%~0" >nul 
if not errorlevel 1 set interactive=0 

rem now I can use %interactive% anywhere 

if _%1_==__ (
    echo usage: %~nx0 filename 
    if _%interactive%_==_0_ pause 
) 

Editar: correcciones aplicadas para los problemas de cambios discutidos en los comentarios; ejemplo para demostrar que

+0

lo suficientemente extraño: si abre nueva sesión en cmd.exe y llamas a esto, la primera vez pausa: parece que 'encontrar' no aumenta'% errorlevel% 'en el primer intento. El siguiente y otros intentos están bien. –

+0

La subida de '% errorlevel%' también falla si otros comandos (par típico de 'set's y' cd' en mi caso) están presentes * antes * de esta construcción. –

+0

Además, esto no funcionará en una subrutina llamada usando 'call: somesub'. En ese caso, '% cmdcmdline%' contendrá solo la etiqueta de esa subrutina: '% cmdcmdline%'. –

1

Aquí, escribí algo ...

Usage.bat


@echo off 
if arg%1==arg goto help 
goto action 

:action 
echo do something... 
goto end 

:help 
set help1=This is Help line 1. 
set help2=This is Help line 2. 
cmd.exe /k "echo %help1% &echo %help2%" 
goto end 

:end 

No es perfecto, pero funciona! : D

-joedf

4
:: exit if not interactive 
echo %CMDCMDLINE% | find /i "/c" 
if not ERRORLEVEL 1 goto:eof 
+0

¿Podría dar más información sobre cómo esto difiere de la respuesta aceptada? –

0

editado Utilice findstr

echo %cmdcmdline% | findstr /ic:"%~f0" >nul && (pause >nul) 

o

setlocal EnableDelayedExpansion 
. 
. 
echo !cmdcmdline! | findstr /ic:"%~f0" >nul && (pause >nul) 
. 
. 
endlocal 

Esto siempre se trabajó ...

+0

Bueno, * findstr * es un programa externo, por lo que no es realmente "desde dentro", pero sí, una opción viable. –

+0

find.exe findstr.exe - estos son los internos de Windows.eso es similar con un comando interno. – kygg

0

de comando interno

setlocal EnableDelayedExpansion 
set "cmddiff=!cmdcmdline:~0,1!" & if !cmddiff! neq ^" (pause >nul) 
endlocal 

o

setlocal EnableDelayedExpansion 
set "cmddiff=!cmdcmdline:~28,1!" & if !cmddiff! neq ^" (pause >nul) 
endlocal 

Puede comparar lo diferente, pero esto sólo se trabajó en EnableDelayedExpansion. y no creo que esto siempre funcione, porque la versión de Windows, etc ...

0

Esto solo está usando el comando interno. tan eficazmente ....

EnableDelayedExpansion

if "!cmdcmdline!" neq "!cmdcmdline:%~f0=!" pause >nul 

o

if not "!cmdcmdline!" == "!cmdcmdline:%~f0=!" pause >nul 

DisableDelayedExpansion

if "%cmdcmdline%" neq "%cmdcmdline:%~f0=%" pause >nul 

o

if not "%cmdcmdline%" == "%cmdcmdline:%~f0=%" pause >nul 
0

Comience su lote comprobación de% windir% en% CMDCMDLINE% como esto:

echo "%cmdcmdline%" | findstr /ic:"%windir%" >nul && (
    echo Interactive run of: %0 is not allowed 
    pause 
    exit /B 1 
) 
Cuestiones relacionadas