elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Temas
Páginas: [1]
1  Programación / Scripting / [Batch] 6 maneras de saber la longitud de una cadena en: 21 Septiembre 2010, 16:34 pm
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
  1. @ECHO OFF
  2. CALL :LENGHT "STRING"
  3. ECHO.%LEN%
  4. PAUSE>NUL
  5.  
  6. ========================================================================
  7.  
  8. :: Mide la longitud de una cadena
  9. :: Devuelve errorlevel=1 si no se especifica la cadena
  10.  
  11. :LENGHT STRING
  12.  
  13. SETLOCAL ENABLEEXTENSIONS
  14. SET "STRING=%~1"
  15. :: Empieza el contador en 0
  16. IF "%TMPVAR%"=="" SET/A CONT=0
  17. :: Si no se mandan parametros salimos
  18. IF NOT DEFINED STRING ENDLOCAL & EXIT/B 1
  19. ::
  20. :: Extracción de caracteres que aumenta en 1
  21. CALL SET "VAR=%%STRING%:~%CONT%,1%%"
  22. ::
  23. IF DEFINED VAR (
  24. :: Sumamos el contador y llamamos a la funcion
  25. SET "TMPVAR=$" & SET/A CONT+=1 & CALL %~0 "%STRING%"
  26. ) ELSE (
  27. ::Declaramos la variable len
  28. CALL SET LEN=%%CONT%%
  29. )
  30. ENDLOCAL & SET "LEN=%LEN%"
  31. EXIT /B
  32.  
  33. ========================================================================
  34.  
  35.  

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

Código
  1. @ECHO OFF
  2. CALL :LENGTH "STRING"
  3. ECHO %LEN%
  4.  
  5. =========================================================================
  6.  
  7. :: Devuelve la longitud de una string
  8. :: Si no se define la string devuelve errorlevel=1
  9.  
  10. :LENGTH STRING
  11.  
  12. SETLOCAL ENABLEEXTENSIONS
  13. SET "STRING=%~1"
  14. :: Si no se pasan argumentos salimos.
  15. IF NOT DEFINED STRING EXIT/B 1
  16. :: Empieza el contador en 0
  17. IF "%TMPVAR%"=="" SET/A CONT=0
  18. ::
  19. CALL SET "VAR=%%STRING:~,%CONT%%%"
  20. IF NOT "%VAR%"=="%STRING%" (
  21.  
  22. :: Sumamos 1 al contador
  23. SET "TMPVAR=$"
  24. SET/A CONT+=1
  25. :: Llamamos a la funcion
  26. CALL %0 "%~1"
  27.  
  28. ) ELSE (
  29. CALL SET LEN=%%CONT%%
  30. )
  31. ENDLOCAL & SET "LEN=%LEN%"
  32.  
  33. =========================================================================
  34.  

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

Código
  1. @ECHO OFF
  2. CALL :LENGTH "STRING"
  3. ECHO.%LEN%
  4. PAUSE>NUL & EXIT
  5.  
  6. ==============================================================================
  7.  
  8. :: Mide la longitud de una string
  9. :: Crea en el disco un archivo TMP.DAT que al finalizar su función se borra
  10.  
  11. :LENGTH STRING
  12. SETLOCAL ENABLEEXTENSIONS
  13. :: Nos posicionamos en tmp
  14. PUSHD "%TMP%"
  15. :: Creamos el archivo que contiene la string
  16. ECHO.%~1> "TMP.DAT"
  17. ::
  18. FOR %%? IN ("TMP.DAT") DO (
  19. :: Restamos dos caracteres
  20. IF EXIST %%~? SET/A "LEN=%%~Z?-2"
  21. :: Eliminamos el archivo
  22. DEL /F /Q %%~F?
  23. )
  24. ::
  25. ::
  26. (
  27. SET LEN=%LEN%
  28. )
  29.  
  30. ==============================================================================
  31.  
  32.  

4.Con el comando dir

Código
  1. @ECHO OFF
  2. CALL:LENGTH "STRING"
  3. ECHO.%LEN%
  4.  
  5. ========================================================================================
  6.  
  7. :: Mide la longitud de una string
  8. :: Crea en el disco un archivo TMP.DAT que al finalizar su función se borra
  9. :: Devuelve errorlevel=1 si no se especifica la cadena
  10.  
  11. :LENGTH
  12.  
  13. SETLOCAL ENABLEEXTENSIONS
  14. :: Nos posicionamos en tmp
  15. PUSHD "%TMP%"
  16. :: Salimos si no se pasan argumentos
  17. IF "%~1"=="" EXIT/B 1
  18. ::
  19. :: Creamos el archivo tmp.dat que contiene la string
  20. ECHO.%~1>TMP.DAT
  21. :: Con dir obenemos el peso del archivo
  22. FOR /F "TOKENS=3" %%F IN ('"DIR /A:-D | FIND /I "TMP.DAT""') DO SET "LEN=%%~F"
  23. ::RESTAMOS DOS CARACTERES (ASCII 10 Y 13)
  24. SET/A LEN-=2
  25. ::
  26. ENDLOCAL & SET LEN=%LEN%
  27.  
  28. ========================================================================================
  29.  
  30.  

5. Con el comando findstr

Código
  1. @ECHO OFF
  2. CALL :LENGTH "STRING"
  3. ECHO.%LEN%
  4.  
  5. ==============================================================
  6.  
  7. :: Mide la longitud de una cadena
  8. :: Devuelve errorlevel=1 si no se especifica la cadena
  9.  
  10. :LENGTH "STRING"
  11.  
  12. SETLOCAL ENABLEEXTENSIONS
  13. :: Salimos si no se especifican argumentos
  14. IF "%~1"=="" EXIT/B 1
  15. ::
  16. :: Podemos usar también el metacaracter $
  17. FOR /F "DELIMS=:" %%F IN (
  18. '"(ECHO.%~1 & ECHO.) | FINDSTR /O ."'
  19. ) DO SET/A LEN=%%~F-3
  20. ENDLOCAL & SET "LEN=%LEN%"
  21.  
  22. ==============================================================
  23.  
  24.  

6. Con el comando debug

Código
  1. @ECHO OFF
  2. CALL :LENGTH "STRING"
  3. ECHO.%LEN%
  4.  
  5. ===================================================================================
  6.  
  7. :: Mide la longitud de una string
  8. :: Crea en el disco dos archivos TMP.BIN y TMP.DAT que se borran al finalizar.
  9. :: Usa el comando debug
  10.  
  11. :LENGTH STRING
  12.  
  13. SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
  14. :: Nos posicionamos en temp
  15. PUSHD "%TEMP%"
  16. :: Creamos el archivo tmp.bin con la string
  17. ECHO.%~1>TMP.BIN
  18. ::
  19. :: Cargamos el archivo con debug
  20. (
  21. ECHO.R CX
  22. ECHO.Q
  23. ) | DEBUG TMP.BIN >TMP.DAT
  24.  
  25. :: Con for cogemos el registro CX
  26. FOR /F "TOKENS=2 SKIP=1" %%A IN ('TYPE TMP.DAT ^| SORT') DO SET "VAR=%%A"
  27. :: Quitamos ceros
  28. FOR /L %%A IN (1 1 4) DO IF "!VAR:~0,1!" EQU "0" SET "VAR=!VAR:~1!"
  29. ::
  30. :: Restamos 2 caracteres
  31. SET/A VAR-=2
  32. :: Eliminamos archivos creados
  33. FOR %%F IN ("TMP.BIN" "TMP.DAT") DO DEL /Q /F %%~FF
  34. POPD & ENDLOCAL & SET "LEN=%VAR%"
  35.  
  36. ===================================================================================
  37.  
  38.  
  39.  

saludos :D
2  Programación / Scripting / [Batch] Suma decimales en: 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
  1. :: Suma decimales
  2.  
  3. :: By modubat
  4.  
  5. @ECHO OFF
  6. (%comspec% /a /q /e:on /v:off /c "%~n$path:0") || EXIT/b
  7. SET/p "num1=>"
  8. echo. +
  9. SET/p "num2=>"
  10. CALL:SUMA "%num1%" "%num2%"
  11. ECHO.RESULTADO: %res%
  12. PAUSE>NUL
  13. EXIT/B 1
  14.  
  15. :suma
  16. SET/A COUNT=0
  17. FOR %%A IN ("%~1" "%~2") DO IF "%%~A"=="" GOTO:EOF
  18. SET "NUM1=%~1" & SET "NUM2=%~2" & SET "DEC1=0" & SET "DEC2=0"
  19. ECHO.%NUM1% | FIND "." >NUL && FOR /F "TOKENS=1-2 DELIMS=." %%A IN ("%NUM1%") DO (SET "NUM1=%%A" & SET "DEC1=%%B")
  20. ECHO.%NUM2% | FIND "." >NUL && FOR /F "TOKENS=1-2 DELIMS=." %%A IN ("%NUM2%") DO (SET "NUM2=%%A" & SET "DEC2=%%B")
  21. CALL:LEN "%dec1%"
  22. SET "l_dec1=%len%"
  23. CALL:LEN "%dec2%"
  24. SET "l_dec2=%len%"
  25. SET/a"l_dec=l_dec1-l_dec2"
  26. IF %l_dec% GTR 0 SET _var=true
  27. IF %l_dec% LSS 0 SET _var=false
  28. CALL:ABSOLUTE "%l_dec%"
  29. SET "l_dec=%NUM%"
  30. IF "%_var%"=="true" FOR /l %%a in (1 1 %l_dec%) do CALL SET dec2=%%dec2%%0
  31. IF "%_var%"=="false" FOR /l %%a in (1 1 %l_dec%) do CALL SET dec1=%%dec1%%0
  32. SET/a"grn=%dec1:~0,1%+%dec2:~0,1%"
  33. IF "%grn%"==0 SET "dec1=1%dec1%" & SET "dec2=1%dec2%"
  34. SET/a dec=dec1+dec2,num=num1+num2"
  35. IF "%grn%"=="0" SET dec=%dec:~1%
  36. CALL:LEN "%dec%"
  37. IF "%_var%"=="true" IF ["%len%"] NEQ ["%l_dec1%"] SET dec=%dec:~1% & SET/a num+=1
  38. IF "%_var%"=="false" IF ["%len%"] NEQ ["%l_dec2%"] SET dec=%dec:~1% & SET/a num+=1
  39. IF "%_var%"=="" IF ["%len%"] NEQ ["%l_dec1%"] SET dec=%dec:~1% & SET /a num+=1
  40. IF "%grn%"=="0" CALL :soub
  41. SET res=%num%.%dec%
  42. GOTO:EOF
  43.  
  44. :COMP
  45. if %dec% GTR 0 (
  46. set "comp1=1%~1"
  47. set "comp2=%~2"
  48. set/a comp=comp1-comp2
  49. call set comp=%%comp:~1%%
  50. ) else (set/a "comp=%~1-%~2")
  51. GOTO :EOF
  52.  
  53. :SOUB
  54. SET "dec1=1%dec1%" & SET "dec2=1%dec2%"
  55. SET/a dec=dec1+dec2
  56. SET dec=%dec:~1%
  57. GOTO :EOF
  58.  
  59. :REST
  60. CALL:LEN %*
  61. SET "tmpstring=%len%"
  62. SET/a tmpstring-=1,rdn_=1
  63. FOR /l %%i in (1 1 %tmpstring%) do CALL SET "rdn_=%%rdn_%%0"
  64. GOTO :EOF
  65.  
  66. :LEN
  67. IF "%~1"=="" GOTO:EOF
  68. FOR /F "DELIMS=:" %%F IN ('^(ECHO.%~1^&ECHO.^) ^| FINDSTR /O .') DO SET/A LEN=%%F-3
  69. GOTO :EOF
  70.  
  71. :ABSOLUTE
  72. SET "NUM=%~1"
  73. SET "NUM=%NUM:-=%
  74.  
  75.  

saludos


3  Programación / Scripting / [Batch][Ansi.sys] Calculadora con colores en: 3 Septiembre 2010, 16:23 pm
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
  1. ::by modubat
  2. @echo off
  3. SetLocal EnableExtensions
  4. echo we recommend to do first a copy of config.nt  & pause
  5. 0<nul more /c
  6. :: make a backup of config.nt in temp folder
  7. >nul Copy /Y "%windir%\System32\config.nt" "%tmp%\config.nt"
  8. :: load ansi.sys
  9. del /f /q "%windir%\System32\config.nt"
  10. For %%a In (
  11. "rem Ansi.sys loaded"
  12. "DOSONLY"
  13. "dos=high, umb"
  14. "files=40"
  15. "DEVICE=%WinDir%\System32\ANSI.SYS /x"
  16. ) Do >>"%WinDir%\System32\config.nt" Echo.%%~a 2>&1
  17. command /c echo First number:
  18. set/p "num1=>"
  19. command /c echo Second number:
  20. set/p "num2=>"
  21. set/a a=num1+num2,b=num1-num2,c=num1*num2,d=num1/num2
  22. command /c echo Results
  23. command /c echo %num1% + %num2% = %a%
  24. command /c echo %num1% - %num2% = %b%
  25. command /c echo %num1% * %num2% = %c%
  26. command /c echo %num1% / %num2% = %d%
  27. :: check if ansi was loaded
  28. Mem/c | Findstr.exe /I "ansi" >nul ^
  29. || Echo ANSI.SYS is not loaded
  30. :: restore the config.nt file
  31. Copy /Y "%tmp%\config.nt" "%windir%\System32\config.nt" 1>nul
  32. For %%i in ("%temp%\Config.nt") do del /f /q %%~fi
4  Programación / Scripting / [Batch Game] Snake en: 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
  1. :: [Batch Game] Snake
  2.  
  3. :: by modubat
  4.  
  5. @echo off
  6. setlocal enableextensions enabledelayedexpansion
  7. mode con cols=25 lines=14
  8. title Snake
  9. set "filas=9" & set "columnas=17"
  10. set "print=Û" & set "jugador=" & set "fondo= "
  11. set "coordenadas=" & set "personaje=;01X01Y" & set "punto=;09X05Y"
  12. set "puntos=-1"
  13. set "opcion=D"
  14. call :puntos "%filas%" "%columnas%" "%coordenadas%" "%personaje%"
  15.  
  16. :Ini
  17. more/c <nul
  18. set "coordenadas=%coordenadas%%personaje%"
  19. if "%personaje%"=="%punto%" ( call :puntos "%filas%" "%columnas%" "%coordenadas%" "%personaje%" ) else (
  20. call :eliminar "!coordenadas!"
  21. )
  22. call :coordenates "%filas%" "%columnas%" "%coordenadas%" "%fondo%" "%print%" "%personaje%" "%jugador%" "%punto%"
  23. call :set_pers "%personaje%"
  24. choice /c DASWPX /n /t 1 /d %opcion% >nul
  25. if "%errorlevel%" equ "5" set "opcion=%opcion%" & pause>nul
  26. if "%errorlevel%" equ "6" goto :lost
  27. set "token=%errorlevel%"
  28. for /f "tokens=%token% delims=$" %%a in ("D$A$S$W") do set "opcion=%%a"
  29. for /f "tokens=%token% delims=$" %%b in ("right$left$down$up") do (
  30. call :Move %%b "!Cord_x!" "!Cord_y!" "!filas!" "!columnas!")
  31. if "%errorlevel%" equ "1" goto :lost
  32. if "%errorlevel%" equ "0" call:col "%coordenadas%" "%personaje%" "%rangX%" "%rangY%"
  33. if "%errorlevel%" equ "1" goto :lost
  34. if "%errorlevel%" equ "0" set "personaje=;%rangX%X%rangY%Y"
  35. goto :Ini
  36.  
  37. :coordenates filas columnas coordenadas fondo print personaje
  38. setlocal enableextensions enabledelayedexpansion
  39. for %%X in ("%~1" "%~2" "%~3" "%~4" "%~5") do if /i "%%~X"=="" exit /b 1
  40. for /l %%i in (1 1 %~2) do (
  41. for /l %%j in (1 1 %~1) do (
  42. if not %%i LSS 10 (set var_x=%%i) else (set var_x=0%%i)
  43. if not %%j LSS 10 (set var_y=%%j) else (set var_y=0%%j)
  44. set "!var_x!X!var_y!Y=%~4"
  45. ))
  46. for %%f in (%~3) do set "%%f=%~5"
  47. for %%g in (%~6) do set "%%g=%~7"
  48. for %%h in (%~8) do set "%%h=Ï"
  49. for /l %%a in (1 1 %~1) do (
  50. if not %%a LSS 10 (set find_y=%%a) else (set find_y=0%%a)
  51. for /f "Tokens=2 delims==" %%b in ('set ^| find "!find_y!Y" ^| find /v ";" ^| sort') do (
  52. set "fila%%a=!fila%% style="color: #448888;">a!%% style="color: #448888;">b"))
  53. echo.  ±±±±±±±±±±±±±±±±±±±
  54. for /l %%z in (%~1 -1 1) do (echo.  ±!fila%% style="color: #448888;">z!±)
  55. echo.  ±±±±±±±±±±±±±±±±±±±
  56.  
  57. :set_pers
  58. for /f "tokens=1,2 delims=;XY" %%a in ("%~1") do (
  59. set Cord_x=%%~a
  60. set Cord_y=%%~b)
  61. goto:eof
  62.  
  63. :eliminar
  64. for /f "tokens=1* delims=; eol=" %%a in ("%~1") do (
  65. set "%%~a="
  66. set "coordenadas=;%%~b"
  67. )
  68.  
  69. set "Cord_X=%~2" & set "Cord_Y=%~3"
  70. for %%a in ("Cord_X" "Cord_Y") do if !% style="color: #448888;">%~a! lss 10 set "%%~a=!% style="color: #448888;">%~a:~1!"
  71. if "%1"=="right" set/a "rangX=Cord_X+1,rangY=Cord_Y"
  72. if "%1"=="left" set/a "rangX=Cord_X-1,rangY=Cord_Y"
  73. if "%1"=="down" set/a "rangX=Cord_X,rangY=Cord_Y-1
  74. if "%1"=="up" set/a "rangX=Cord_X,rangY=Cord_Y+1"
  75. if %rangX% GTR %~5 (exit/b 1) else if %rangX% LEQ 0 (exit/b 1)
  76. if %rangY% GTR %~4 (exit/b 1) else if %rangY% LEQ 0 (exit/b 1)
  77. for %%b in ("rangX" "rangY") do if !% style="color: #448888;">%~b! LSS 10 set "%%~b=0!% style="color: #448888;">%~b!"
  78. exit/b 0
  79.  
  80. :puntos filas columnas coordenadas personaje
  81. set/a Pos_x=%random%%%%~2+1,Pos_y=%random%%%%~1+1
  82. for %%a in ("Pos_X" "Pos_Y") do if !% style="color: #448888;">%~a! LSS 10 set "%%~a=0!% style="color: #448888;">%~a!"
  83. set "punto=%Pos_x%X%Pos_y%Y"
  84. for %%a in (%~3,%~4) do if "%%a"=="!punto!" goto :puntos
  85. set/a puntos+=1
  86. set "punto=;%punto%"
  87. goto:eof
  88.  
  89. :col
  90. for %%a in (%~1) do for %%b in (;%~3X%~4Y) do if "%%a"=="%%b" exit/b 1
  91. exit/b 0
  92.  
  93. :lost
  94. more/c <nul
  95. echo GAME OVER!!!
  96. echo.Puntos:%puntos%
  97. pause>nul
  98.  


saludos

Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines