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 - 0x0309

#121
Hasta hace poco los únicos atributos que conocía de los archivos en windows familia nt, eran:
sólo lectura
oculto
archivo
sistema

y son los únicos que podemos establecer con attrib.exe

Jugando con el comando for, la documentación de Microsoft dice: que si tenemos una variable de comando for, por ejemplo la variable I y hacemos:

%%~aI (dentro de un archivo por lotes (modo script))
%~aI (modo interactivo)

se expanden los atributos del archivo.

Yo pensé que sólo existían 4 atributos, pero me entró curiosidad de porqué la expansión que realiza el comando for, siempre son 9 guiones.
-rahs----

Como attrib.exe sólo permite establer 4 atributos, tuve que buscar maneras de establecer otros atributos (código c, compact, fsutil, etc.).

Finalmente conseguí todo el listado las letras que aparecen en la expansión de atributos del comando for:

Esto es lo no documentado:
Attributo Expansión
FILE_ATTRIBUTE_DIRECTORY d--------
FILE_ATTRIBUTE_READONLY -r-------
FILE_ATTRIBUTE_ARCHIVE --a------
FILE_ATTRIBUTE_HIDDEN ---h-----
FILE_ATTRIBUTE_SYSTEM ----s----
FILE_ATTRIBUTE_COMPRESSED -----c---
FILE_ATTRIBUTE_OFFLINE ------o--
FILE_ATTRIBUTE_TEMPORARY -------t-
FILE_ATTRIBUTE_REPARSE_POINT --------l


Otros atributos que que no son reconocidos o expandidos por el comando for:
FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_ENCRYPTED
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
FILE_ATTRIBUTE_SPARSE_FILE

También conocí otros iconos o color de texto que identifican un atributo de archivo:

Oculto y Cifrado


Oculto y Comprimido.


Offline.



#122
Scripting / Re: Juego Batch: Worm 6
15 Marzo 2009, 23:48 PM
Publique una ligera corrección, ahora es la versión 6.0b, lo único que cambié fue la cantidad de 1 segundo a 2.
#123
Puede que casi nunca se use esto, pero yo actualizando mi juego worm hecho en batch, tuve la necesidad de hacer una doble expansión retardada, ya que estaba dentro de un if, y lo hice usando for.

Ejemplo (no del código del juego, simplemente para explicar esto):

@echo off

setlocal enabledelayedexpansion

set tabla[0]=Multics
set tabla[1]=Unix
set tabla[2]=BSD
set tabla[3]=Linux
set tabla[4]=Windows9x
set tabla[5]=WindowsNT
set tabla[6]=SanOS
set tabla[7]=JOs
set tabla[8]=OpenSuse
set tabla[9]=Windows7


for /l %%a in (0,1,4) do call :test numero %%a
pause
goto :eof

:test
if %1==numero (
set nombreTabla=tabla[%2]

rem if !%nombreTabla%!
rem no se puede hacer esto dentro del if
rem porque la variable nombreTabla
rem la declaramos o actualizamos dentro del if
rem por lo tanto la expansión simple no funcionaría (%)
rem y necesitamos expansión retarada (!) doble

rem Como? con el for

rem dentro del for /f en in hacemos una expansion retardada y en el do hacemos la siguiente, también retardada del contenido de la expansión anterior.
for /f "tokens=* eol=" %%v in ("!nombreTabla!") do if !%%v!==Windows9x (
set %%v=WindowsNT
rem o set !nombreTabla!=WindowsNT
)

)
echo.............
set nombreTabla
set tabla[4]
set tabla[5]
echo.............
goto :eof




El truco está: en !%%v!

Esto es un solo un ejemplo solo para demostrar como realizar una doble expansión retardada dentro de un if usando el for /f. Alguien podría decir que la solución al problema es:

if !tabla[%2]!==Windows9x (set tabla[%2]=WindowsNt)

pero el código es solo un ejemplo, y el problema es que estaba dentro de un if.
Esto es solo para casos especiales. El código del juego realmente no estaba dentro de un if sino dentro de un for, pero ambos, tanto if como for expanden de manera simple en la entrada y no en la ejecución:


FOR /L %%A IN (0,1,5) DO (
SET "_CANDIDATE=BOARD[!RANDOM:~-1!][!RANDOM:~-1!]"
FOR /F "TOKENS=1 DELIMS==" %%B IN ("!_CANDIDATE!") DO IF ^!%%B! EQU ^° (
SET "!_CANDIDATE!=Ï"
GOTO :PLAY
)
)

Este código lo que hace es intentar 5 veces encontrar una variable BOARD[X][Y] aleatoria con contenido igual a "vacío" para asignar otro valor, en este caso: "comida"
Ah, y el goto es para quebrar el for.
#124
Scripting / Juego Batch: Worm 6
15 Marzo 2009, 10:28 AM
He decidido actualizar el juego batch que hice la otra vez, esta vez, he puesto enfásis en la velocidad, por lo que el código no quedó tan legible, pero sí más veloz, y con una mejor presentación.

Aquí está:


http://sites.google.com/site/wormbatchgame/Home/WORM6b.zip?attredirects=0
#125
He creado otra versión del script, pero solo para ser ejecutada bajo Windows XP, y solo para unidades removibles con sistema de archivos fat32, la razón es que no se producen los mismos resultados al ejecutar el script bajo Windows XP y Windows Vista. Esta versión es más segura, una vez ejecutado en windows xp, la unidad removible con fat32, queda con una carpeta autorun.inf imborrable, por lo menos yo uso esta versión ahora:


@ECHO OFF
:: RDAP.CMD
:: REMOVABLE DRIVE AUTORUN PROTECTOR Version 12:44 14-03-2009
::
:: ONLY FOR RUN UNDER WINDOWS XP AND REMOVABLE DRIVE WITH FAT OR FAT32 FILESYSTEM.
::
:: AUTHOR: 0X0309
::
TITLE REMOVABLE DRIVE AUTORUN PROTECTOR
SETLOCAL ENABLEEXTENSIONS

VER | FIND /i " XP"  >NUL
IF ERRORLEVEL -1 IF ERRORLEVEL 1 (
ECHO. SCRIPT ONLY FOR WINDOWS XP.
GOTO END
)

ECHO\Detecting removable drives . . .
SET "TXT=530054004F00520041"
FOR /F "DELIMS=\: TOKENS=0X3" %%^^ IN ('REG QUERY HKLM\SYSTEM\MOUNTEDDEVICES ^| FIND "%TXT%"') DO (
VOL %%^^: 8>NUL 1>&8 2>&1 && (
ECHO\Found removable drive %%^^:
CHKDSK %%^^: 0>NUL 2>&0 | FIND " FAT" >NUL
IF ERRORLEVEL 0 IF NOT ERRORLEVEL 1 (
IF EXIST %%^^:\AUTORUN.INF (DEL /F /Q /A %%^^:\AUTORUN.INF 7>NUL 1>&7 2>&1)
IF EXIST %%^^:\AUTORUN.INF (RD /Q /S \\?\%%^^:\AUTORUN.INF 6>NUL 1>&6 2>&1)
(MD \\?\%%^^:\AUTORUN.INF\...\) 5>NUL 1>&5 2>&1
(RD /Q /S \\?\%%^^:\AUTORUN.INF\...) 4>NUL 1>&4 2>&1
(CD.>\\?\%%^^:\AUTORUN.INF\NUL) 3>NUL 1>&3 2>&1
(MD \\?\%%^^:\AUTORUN.INF\...\%RANDOM%\...\ 9>NUL 1>&9 2>&1)
IF EXIST %%^^:\AUTORUN.INF (ECHO\The removable drive %%^^: was protected.)
) ELSE (ECHO. %%^^: IS NOT WITH FILESYSTEM FAT OR FAT32.)
)
)

:END
(0>NUL SET /P %%=Press a key to quit . . . )
PAUSE >NUL
GOTO :EOF
#126
Listo, en el mismo enlace:
http://sites.google.com/site/ntbatchsite/universal-batch-operating-system-detector

dejé la versión corregida y actualizada, ahora puede ser ejecutada aún cuando el servicio workstation esté detenido (net stop workstation).

Saludos.
#127
Cita de: Germaniac en 10 Marzo 2009, 01:01 AM
por que no haces mejor

'net.exe config workstation ^| find.exe "Windows" ^| find.exe /i "Versi¢n del programa"'

y para los que esten en ingles lo mismo pero cambiando Versi¢n del programa

¿y los que tienen el sistema operativo en alemán?

ya tengo la solución, ahora estoy realizando más pruebas, por ejemplo también acabo de darme cuenta que net.exe config workstation necesita el servicio workstation ejecutándose, por ejemplo si pones net stop workstation y luego net.exe config workstation se arroja un error. (Esto también está solucionado, pero seguiré haciendo más pruebas, tal vez en unos dos días publique la nueva versión)
#128
Pronto publicaré una nueva revisión, que tengo terminada, pero estoy esperando pronto poder testearla en windows seven.
#129
Participando en el grupo usenet alt.msdos.batch.nt se mostraron soluciones para detectar el sistema operativo en el que se ejecuta un script batch, basándome en el trabajo de Timo Salmi, creé otro script.

Aquí está:
http://sites.google.com/site/ntbatchsite/universal-batch-operating-system-detector

Si se modifica se debe hacer con cuidado, porque command.com (en windows 95/98) no es tan flexible como cmd.exe.

De todas formas, el script, lo he probado y también exitosamente en:
MS-DOS 7.10
Windows 95
Windows 98
Windows NT
Windows 2000
Windows XP
Windows 2003

En la misma página, pueden descargar en adjunto una imagen .iso de 50 KB aprox, para así cargar el script dentro de una máquina virtual.


¿Podría alguien probarlo en Windows Vista y Seven?

#130
En realidad, me equivoqué, no se puede, porque al redirigir la salida de errores a nul se evita el mensaje de error, pero si en el "comentario" colocas un símbolo como + * / sin anteponer nada, por ejemplo +
dirás suma 0. por lo que igual se interpretan dichos carácteres.

Ejemplo:

@echo off
2>nul set /a "operacion=1000*2-500" +1 se multiplica 1000 por 2 y se restan 500
echo.%operacion%
pause

debería dar 1500, pero da 1501

y lo que tú dices puede utilizarse siempre que no se utilizen símbolos especiales

set "system=wintendo" /* & calc comentario */