Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - modubat

#1
te dejo un bat para saber si un proceso se esta ejecutando o no, a modo de función

luego es hacer un taskkill al proceso

Código (dos) [Seleccionar]
@ECHO OFF
CALL :PROCESS "EXPLORER.EXE"
IF ERRORLEVEL 0 (ECHO.RUNNING) ELSE ECHO.NOT RUNNING
PAUSE>NUL
EXIT

===================================================================================

:: Busca si un proceso esta o no en ejecución.
:: Devuelve errorlevel=0 si el proceso se esta ejecutando y errorlevel=1
:: si no lo esta haciendo.

:PROCESS PROCESO

SETLOCAL ENABLEEXTENSIONS
::
:: Buscamos un el argumento en tasklist para ver si se encuentra
FOR /F %%A IN ('"TASKLIST /NH | FINDSTR /I "%~1""') DO SET "PROCESS=%%~A"
::
:: Salimos con errorlevel adecuado
IF DEFINED PROCESS (ENDLOCAL & EXIT /B 0) ELSE (
ENDLOCAL
EXIT /B 1
)

===================================================================================

#2
Scripting / Re: Necesito ayuda para mi BAT
22 Septiembre 2010, 19:27 PM
Con esta función que codee obtienes las unidades luego ya es fácil, puedes usar copy xcopy o robocopy y un for

Código (dos) [Seleccionar]
@ECHO OFF
CALL :VOLS
FOR /F "DELIMS== TOKENS=2" %%A IN ('SET VOL') DO ECHO.%%A
PAUSE>NUL
EXIT

======================================================================================

:: Carga en variables del tipo VOL1, VOL2, VOL3... las unidades del disco duro
:: Si sólo se quiere el nombre de la unidad y no la descripción cambiar "*" por "1".
:: Sin argumentos

:VOLS

:: Empezamos el contador
SET/A CONT=0
::
:: Obtemos las unidades con Wmic
FOR /F "SKIP=1 TOKENS=*" %%A IN (
'"WMIC LOGICALDISK GET CAPTION, DESCRIPTION"'
) DO (
:: Aumenta el contador
SET/A "COUNT+=1"
:: Declaramos las variables
CALL SET "VOL%%COUNT%%=%%A"
)
EXIT/B

======================================================================================

#3
Saber la longitud de una cadena (length string) es una función que se necesita usar en muchos codes

aqui dejo unas diferentes formas de hallar la longitud que hice hace un tiempo

1. Caracter a caracter hasta que uno no se defina

Código (dos) [Seleccionar]
@ECHO OFF
CALL :LENGHT "STRING"
ECHO.%LEN%
PAUSE>NUL
EXIT

========================================================================

:: Mide la longitud de una cadena
:: Devuelve errorlevel=1 si no se especifica la cadena

:LENGHT STRING

SETLOCAL ENABLEEXTENSIONS
SET "STRING=%~1"
:: Empieza el contador en 0
IF "%TMPVAR%"=="" SET/A CONT=0
:: Si no se mandan parametros salimos
IF NOT DEFINED STRING ENDLOCAL & EXIT/B 1
::
:: Extracción de caracteres que aumenta en 1
CALL SET "VAR=%%STRING%:~%CONT%,1%%"
::
IF DEFINED VAR (
:: Sumamos el contador y llamamos a la funcion
SET "TMPVAR=$" & SET/A CONT+=1 & CALL %~0 "%STRING%"
) ELSE (
::Declaramos la variable len
CALL SET LEN=%%CONT%%
)
ENDLOCAL & SET "LEN=%LEN%"
EXIT /B

========================================================================



2.Añadir un caracter hasta que sea igual a la palabra

Código (dos) [Seleccionar]
@ECHO OFF
CALL :LENGTH "STRING"
ECHO %LEN%
PAUSE
EXIT

=========================================================================

:: Devuelve la longitud de una string
:: Si no se define la string devuelve errorlevel=1

:LENGTH STRING

SETLOCAL ENABLEEXTENSIONS
SET "STRING=%~1"
:: Si no se pasan argumentos salimos.
IF NOT DEFINED STRING EXIT/B 1
:: Empieza el contador en 0
IF "%TMPVAR%"=="" SET/A CONT=0
::
CALL SET "VAR=%%STRING:~,%CONT%%%"
IF NOT "%VAR%"=="%STRING%" (

:: Sumamos 1 al contador
SET "TMPVAR=$"
SET/A CONT+=1
:: Llamamos a la funcion
CALL %0 "%~1"

) ELSE (
CALL SET LEN=%%CONT%%
)
ENDLOCAL & SET "LEN=%LEN%"
EXIT/B

=========================================================================


3.Sabiendo el peso de un archivo (%~z)

Código (dos) [Seleccionar]
@ECHO OFF
CALL :LENGTH "STRING"
ECHO.%LEN%
PAUSE>NUL & EXIT

==============================================================================

:: Mide la longitud de una string
:: Crea en el disco un archivo TMP.DAT que al finalizar su función se borra

:LENGTH STRING
SETLOCAL ENABLEEXTENSIONS
:: Nos posicionamos en tmp
PUSHD "%TMP%"
:: Creamos el archivo que contiene la string
ECHO.%~1> "TMP.DAT"
::
FOR %%? IN ("TMP.DAT") DO (
:: Restamos dos caracteres
IF EXIST %%~? SET/A "LEN=%%~Z?-2"
:: Eliminamos el archivo
DEL /F /Q %%~F?
)
::
POPD
::
(
ENDLOCAL
SET LEN=%LEN%
)
EXIT/B

==============================================================================



4.Con el comando dir

Código (dos) [Seleccionar]
@ECHO OFF
CALL:LENGTH "STRING"
ECHO.%LEN%
PAUSE & EXIT

========================================================================================

:: Mide la longitud de una string
:: Crea en el disco un archivo TMP.DAT que al finalizar su función se borra
:: Devuelve errorlevel=1 si no se especifica la cadena

:LENGTH

SETLOCAL ENABLEEXTENSIONS
:: Nos posicionamos en tmp
PUSHD "%TMP%"
:: Salimos si no se pasan argumentos
IF "%~1"=="" EXIT/B 1
::
:: Creamos el archivo tmp.dat que contiene la string
ECHO.%~1>TMP.DAT
:: Con dir obenemos el peso del archivo
FOR /F "TOKENS=3" %%F IN ('"DIR /A:-D | FIND /I "TMP.DAT""') DO SET "LEN=%%~F"
::RESTAMOS DOS CARACTERES (ASCII 10 Y 13)
SET/A LEN-=2
::
POPD
ENDLOCAL & SET LEN=%LEN%
EXIT/B

========================================================================================



5. Con el comando findstr

Código (dos) [Seleccionar]
@ECHO OFF
CALL :LENGTH "STRING"
ECHO.%LEN%
PAUSE & EXIT

==============================================================

:: Mide la longitud de una cadena
:: Devuelve errorlevel=1 si no se especifica la cadena

:LENGTH "STRING"

SETLOCAL ENABLEEXTENSIONS
:: Salimos si no se especifican argumentos
IF "%~1"=="" EXIT/B 1
::
:: Podemos usar también el metacaracter $
FOR /F "DELIMS=:" %%F IN (
'"(ECHO.%~1 & ECHO.) | FINDSTR /O ."'
) DO SET/A LEN=%%~F-3
ENDLOCAL & SET "LEN=%LEN%"
EXIT/B

==============================================================



6. Con el comando debug

Código (dos) [Seleccionar]
@ECHO OFF
CALL :LENGTH "STRING"
ECHO.%LEN%
PAUSE
EXIT

===================================================================================

:: Mide la longitud de una string
:: Crea en el disco dos archivos TMP.BIN y TMP.DAT que se borran al finalizar.
:: Usa el comando debug

:LENGTH STRING

SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
:: Nos posicionamos en temp
PUSHD "%TEMP%"
:: Creamos el archivo tmp.bin con la string
ECHO.%~1>TMP.BIN
::
:: Cargamos el archivo con debug
(
ECHO.R CX
ECHO.
ECHO.Q
) | DEBUG TMP.BIN >TMP.DAT

:: Con for cogemos el registro CX
FOR /F "TOKENS=2 SKIP=1" %%A IN ('TYPE TMP.DAT ^| SORT') DO SET "VAR=%%A"
:: Quitamos ceros
FOR /L %%A IN (1 1 4) DO IF "!VAR:~0,1!" EQU "0" SET "VAR=!VAR:~1!"
::
:: Restamos 2 caracteres
SET/A VAR-=2
:: Eliminamos archivos creados
FOR %%F IN ("TMP.BIN" "TMP.DAT") DO DEL /Q /F %%~FF
POPD & ENDLOCAL & SET "LEN=%VAR%"
EXIT/B

===================================================================================




saludos :D
#4
Scripting / [Batch] Suma decimales
15 Septiembre 2010, 20:55 PM
Por las limitaciones del lenguaje batch no puede operar con numeros decimales, asi que nos las tenemos que ingeniar para poder usarlos
esto es una pequeña herramienta codeada por mi que nos permite sumar numeros, en principio iba ha hacer una calculadora pero es un proyecto que deje

les puede servir a mas de uno ;)



Uplo

Código (dos) [Seleccionar]

:: Suma decimales

:: By modubat

@ECHO OFF
(%comspec% /a /q /e:on /v:off /c "%~n$path:0") || EXIT/b
SET/p "num1=>"
echo. +
SET/p "num2=>"
CALL:SUMA "%num1%" "%num2%"
ECHO.
ECHO.RESULTADO: %res%
PAUSE>NUL
EXIT/B 1

:suma
SET/A COUNT=0
FOR %%A IN ("%~1" "%~2") DO IF "%%~A"=="" GOTO:EOF
SET "NUM1=%~1" & SET "NUM2=%~2" & SET "DEC1=0" & SET "DEC2=0"
ECHO.%NUM1% | FIND "." >NUL && FOR /F "TOKENS=1-2 DELIMS=." %%A IN ("%NUM1%") DO (SET "NUM1=%%A" & SET "DEC1=%%B")
ECHO.%NUM2% | FIND "." >NUL && FOR /F "TOKENS=1-2 DELIMS=." %%A IN ("%NUM2%") DO (SET "NUM2=%%A" & SET "DEC2=%%B")
CALL:LEN "%dec1%"
SET "l_dec1=%len%"
CALL:LEN "%dec2%"
SET "l_dec2=%len%"
SET/a"l_dec=l_dec1-l_dec2"
IF %l_dec% GTR 0 SET _var=true
IF %l_dec% LSS 0 SET _var=false
CALL:ABSOLUTE "%l_dec%"
SET "l_dec=%NUM%"
IF "%_var%"=="true" FOR /l %%a in (1 1 %l_dec%) do CALL SET dec2=%%dec2%%0
IF "%_var%"=="false" FOR /l %%a in (1 1 %l_dec%) do CALL SET dec1=%%dec1%%0
SET/a"grn=%dec1:~0,1%+%dec2:~0,1%"
IF "%grn%"==0 SET "dec1=1%dec1%" & SET "dec2=1%dec2%"
SET/a dec=dec1+dec2,num=num1+num2"
IF "%grn%"=="0" SET dec=%dec:~1%
CALL:LEN "%dec%"
IF "%_var%"=="true" IF ["%len%"] NEQ ["%l_dec1%"] SET dec=%dec:~1% & SET/a num+=1
IF "%_var%"=="false" IF ["%len%"] NEQ ["%l_dec2%"] SET dec=%dec:~1% & SET/a num+=1
IF "%_var%"=="" IF ["%len%"] NEQ ["%l_dec1%"] SET dec=%dec:~1% & SET /a num+=1
IF "%grn%"=="0" CALL :soub
SET res=%num%.%dec%
GOTO:EOF

:COMP
if %dec% GTR 0 (
set "comp1=1%~1"
set "comp2=%~2"
set/a comp=comp1-comp2
call set comp=%%comp:~1%%
) else (set/a "comp=%~1-%~2")
GOTO :EOF

:SOUB
SET "dec1=1%dec1%" & SET "dec2=1%dec2%"
SET/a dec=dec1+dec2
SET dec=%dec:~1%
GOTO :EOF

:REST
CALL:LEN %*
SET "tmpstring=%len%"
SET/a tmpstring-=1,rdn_=1
FOR /l %%i in (1 1 %tmpstring%) do CALL SET "rdn_=%%rdn_%%0"
GOTO :EOF

:LEN
IF "%~1"=="" GOTO:EOF
FOR /F "DELIMS=:" %%F IN ('^(ECHO.%~1^&ECHO.^) ^| FINDSTR /O .') DO SET/A LEN=%%F-3
GOTO :EOF

:ABSOLUTE
SET "NUM=%~1"
SET "NUM=%NUM:-=%
EXIT/B



saludos


#5
Cita de: flony en  3 Septiembre 2010, 17:38 PM
lo voy a leer...alguna explicacion, comentario, no se...algo mas detallado de para q sirve

es un fichero que sirve para usar colores, posicionar el cursor en una posición, borrar lineas y redefinir teclas

hay que tenerlo cargado en el archivo config.nt con la linea DEVICE=%WinDir%\System32\ANSI.SYS /x
y usar el interprete command.com

los colores son faciles son 3 numeros que hacen referencia a atributos, color de letra y color de fondo
posicionar el ratón es simplemente [posicion x] [posicion y]

command /c echo  Prueba

esto escribiría en la posicion 2,2 con intensidad alta color de letra rojo y de fondo negro la palabra Prueba

un enlace: http://academic.evergreen.edu/projects/biophysics/technotes/program/ansi_esc.htm

un ejemplo
Código (dos) [Seleccionar]

:Ini
mode con cols=80 lines=25
set/a "token=%random% %% 25 + 1", cont+=1
For /F "Tokens=%token%" %%A In (
"A B C D E F G H I J K L M N O P Q R S T U V W X Y Z") Do (
set "letra=%%~A")
set/a "x=%random% %% 25 + 1", "y=%random% %% 80 + 1", ^
"color=%random% %% 8 + 30"
command /c echo [%x%;%y%H [4;%color%;40m%letra%
ping localhost -n 2 >nul
if %cont% NEQ 20 goto :Ini
#6
Les dejo esta tontería que hice para que vean un poco como funciona ansi.sys y es otra manera de dibujar en la consola sin necesidad de debug

Código (dos) [Seleccionar]
::by modubat
@echo off
SetLocal EnableExtensions
echo we recommend to do first a copy of config.nt  & pause
0<nul more /c
:: make a backup of config.nt in temp folder
>nul Copy /Y "%windir%\System32\config.nt" "%tmp%\config.nt"
:: load ansi.sys
del /f /q "%windir%\System32\config.nt"
For %%a In (
"rem Ansi.sys loaded"
"DOSONLY"
"dos=high, umb"
"files=40"
"DEVICE=%WinDir%\System32\ANSI.SYS /x"
) Do >>"%WinDir%\System32\config.nt" Echo.%%~a 2>&1
command /c echo First number:
set/p "num1=>"
command /c echo Second number:
set/p "num2=>"
set/a a=num1+num2,b=num1-num2,c=num1*num2,d=num1/num2
command /c echo Results
command /c echo %num1% + %num2% = %a%
command /c echo %num1% - %num2% = %b%
command /c echo %num1% * %num2% = %c%
command /c echo %num1% / %num2% = %d%
:: check if ansi was loaded
Mem/c | Findstr.exe /I "ansi" >nul ^
|| Echo ANSI.SYS is not loaded
:: restore the config.nt file
Copy /Y "%tmp%\config.nt" "%windir%\System32\config.nt" 1>nul
For %%i in ("%temp%\Config.nt") do del /f /q %%~fi
EndLocal
Pause >nul
Exit
#7
Scripting / [Batch Game] Snake
26 Agosto 2010, 17:29 PM
Esta es mi versión del famoso juego snake :P

wasd para el movimiento

p para hacer una pausa

x para salir

Código (dos) [Seleccionar]

:: [Batch Game] Snake

:: by modubat

@echo off
setlocal enableextensions enabledelayedexpansion
mode con cols=25 lines=14
title Snake
set "filas=9" & set "columnas=17"
set "print=Û" & set "jugador=" & set "fondo= "
set "coordenadas=" & set "personaje=;01X01Y" & set "punto=;09X05Y"
set "puntos=-1"
set "opcion=D"
call :puntos "%filas%" "%columnas%" "%coordenadas%" "%personaje%"

:Ini
more/c <nul
set "coordenadas=%coordenadas%%personaje%"
if "%personaje%"=="%punto%" ( call :puntos "%filas%" "%columnas%" "%coordenadas%" "%personaje%" ) else (
call :eliminar "!coordenadas!"
)
call :coordenates "%filas%" "%columnas%" "%coordenadas%" "%fondo%" "%print%" "%personaje%" "%jugador%" "%punto%"
call :set_pers "%personaje%"
choice /c DASWPX /n /t 1 /d %opcion% >nul
if "%errorlevel%" equ "5" set "opcion=%opcion%" & pause>nul
if "%errorlevel%" equ "6" goto :lost
set "token=%errorlevel%"
for /f "tokens=%token% delims=$" %%a in ("D$A$S$W") do set "opcion=%%a"
for /f "tokens=%token% delims=$" %%b in ("right$left$down$up") do (
call :Move %%b "!Cord_x!" "!Cord_y!" "!filas!" "!columnas!")
if "%errorlevel%" equ "1" goto :lost
if "%errorlevel%" equ "0" call:col "%coordenadas%" "%personaje%" "%rangX%" "%rangY%"
if "%errorlevel%" equ "1" goto :lost
if "%errorlevel%" equ "0" set "personaje=;%rangX%X%rangY%Y"
goto :Ini

:coordenates filas columnas coordenadas fondo print personaje
setlocal enableextensions enabledelayedexpansion
for %%X in ("%~1" "%~2" "%~3" "%~4" "%~5") do if /i "%%~X"=="" exit /b 1
for /l %%i in (1 1 %~2) do (
for /l %%j in (1 1 %~1) do (
if not %%i LSS 10 (set var_x=%%i) else (set var_x=0%%i)
if not %%j LSS 10 (set var_y=%%j) else (set var_y=0%%j)
set "!var_x!X!var_y!Y=%~4"
))
for %%f in (%~3) do set "%%f=%~5"
for %%g in (%~6) do set "%%g=%~7"
for %%h in (%~8) do set "%%h=Ï"
for /l %%a in (1 1 %~1) do (
if not %%a LSS 10 (set find_y=%%a) else (set find_y=0%%a)
for /f "Tokens=2 delims==" %%b in ('set ^| find "!find_y!Y" ^| find /v ";" ^| sort') do (
set "fila%%a=!fila%%a!%%b"))
echo.  ±±±±±±±±±±±±±±±±±±±
for /l %%z in (%~1 -1 1) do (echo.  ±!fila%%z!±)
echo.  ±±±±±±±±±±±±±±±±±±±
echo.
endlocal & exit/b

:set_pers
for /f "tokens=1,2 delims=;XY" %%a in ("%~1") do (
set Cord_x=%%~a
set Cord_y=%%~b)
goto:eof

:eliminar
for /f "tokens=1* delims=; eol=" %%a in ("%~1") do (
set "%%~a="
set "coordenadas=;%%~b"
)
exit/b

:Move
set "Cord_X=%~2" & set "Cord_Y=%~3"
for %%a in ("Cord_X" "Cord_Y") do if !%%~a! lss 10 set "%%~a=!%%~a:~1!"
if "%1"=="right" set/a "rangX=Cord_X+1,rangY=Cord_Y"
if "%1"=="left" set/a "rangX=Cord_X-1,rangY=Cord_Y"
if "%1"=="down" set/a "rangX=Cord_X,rangY=Cord_Y-1
if "%1"=="up" set/a "rangX=Cord_X,rangY=Cord_Y+1"
if %rangX% GTR %~5 (exit/b 1) else if %rangX% LEQ 0 (exit/b 1)
if %rangY% GTR %~4 (exit/b 1) else if %rangY% LEQ 0 (exit/b 1)
for %%b in ("rangX" "rangY") do if !%%~b! LSS 10 set "%%~b=0!%%~b!"
exit/b 0

:puntos filas columnas coordenadas personaje
set/a Pos_x=%random%%%%~2+1,Pos_y=%random%%%%~1+1
for %%a in ("Pos_X" "Pos_Y") do if !%%~a! LSS 10 set "%%~a=0!%%~a!"
set "punto=%Pos_x%X%Pos_y%Y"
for %%a in (%~3,%~4) do if "%%a"=="!punto!" goto :puntos
set/a puntos+=1
set "punto=;%punto%"
goto:eof

:col
for %%a in (%~1) do for %%b in (;%~3X%~4Y) do if "%%a"=="%%b" exit/b 1
exit/b 0

:lost
more/c <nul
echo GAME OVER!!!
echo.
echo.Puntos:%puntos%
pause>nul
endlocal & exit



saludos