batch-file - por - lista de comandos batch
secuencia de comandos por lotes si el usuario presiona Ctrl+C hacer un comando antes de salir (5)
Debes usar trampas para hacer estas trampas
trap ctrl_c INT
function ctrl_c() {
echo "Trapped"
}
Escribí un script que está haciendo net use
al principio y net use /DELETE
al final.
Pero si el usuario decide presionar Ctrl + C y sale del script, necesito hacer un net use /DELETE
.
¿Es eso posible? No puedo encontrar nada en google
Mi idea es similar a la de dbenham. Sin embargo, me llevó una eternidad descubrir cómo minimizar la ventana de la consola actual. Golpeé mi cabeza contra la pared tratando de obtener la ventana de cmd
para no ignorar una pulsación de tecla Alt+Space
usando el método .SendKeys
. Finalmente, recurrí a PowerShell para manejar minimizar y restaurar la ventana de trabajo.
La ventaja de esto sobre el de Dbenham es que inevitablemente tendrás algún usuario invertido cranealmente rectal que se aburre con la ejecución de tu script y lo termina con la X roja. Dbenham no captará eso, pero el mío debería.
@echo off
setlocal
if "%~1" neq "wrapped" (
rem :: Map network drive
net use y: //computername/c$ >NUL
rem :: minimize this console
powershell -windowstyle minimized -command ""
rem :: relaunch self with "wrapped" argument and wait for completion
start /wait "" cmd /c %~f0 wrapped
rem :: After script completes or user interrupts, remove drive mapping and restore window
net use y: /delete >NUL
powershell -windowstyle normal -command ""
goto :EOF
)
:: Main script goes here.
:loop
cls
echo Simulating script execution...
ping -n 2 0.0.0.0 >NUL
goto loop
No creo que esto sea posible. Al comienzo de tu script, puedes usar:
net use /delete 2>nul
net use g: //server/sharename /persistent:no
O podrías probar pushd
lugar de net use
...
If Command Extensions are enabled the PUSHD command accepts
network paths in addition to the normal drive letter and path.
If a network path is specified, PUSHD will create a temporary
drive letter that points to that specified network resource and
then change the current drive and directory, using the newly
defined drive letter. Temporary drive letters are allocated from
Z: on down, using the first unused drive letter found.
De esta forma, siempre tendrá la unidad mapeada correctamente configurada.
Claro, simplemente ejecuta la mayor parte de tu script en una nueva sesión de CMD:
@echo off
if "%~1" neq "_start_" (
net use ...
cmd /c "%~f0" _start_ %*
net use /delete ...
exit /b
)
shift /1
REM rest of script goes here
Mientras la ventana de la consola permanezca abierta, el comando net use /delete
siempre se activará después de que se cierre la sesión interna de cmd. Podría cerrarse debido a una ejecución normal, el usuario presiona Ctrl-C o un error fatal: el net use /delete
final net use /delete
aún se disparará.
Hay una solución muy simple. Solo escribe:
ping -l www."site".com -t 65500>nul
antes de su comando net use / delete. La única forma de romper ese comando es presionar ctrl + c. Por ejemplo:
net use "arguments"
ping -l www.google.com -t 65500>nul
net use /delete
Esta es una buena forma de detectar ctrl + c, pero tenga cuidado con la dirección del sitio que escribe, ya que existe el riesgo de que el sitio se cuelgue. En consecuencia, debe escribir la dirección de un sitio inusual o de un sitio propio (Atención: el sitio debe existir), como un blog o algo así.