[BATCH] Información no documentada de expansión ~a

Iniciado por 0x0309, 18 Marzo 2009, 01:14 AM

0 Miembros y 1 Visitante están viendo este tema.

0x0309

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.




Darioxhcx

buenisimo man
nunca habia leido algo parecido
no te cansas de sacarle jugo a la cmd :P ??

saludos

.;.

Muy buena información, yo pensaba como tú.

Tendré que probar los demás.

¿Una cosa podemos aplicar los atributos de offline por ejemplo?

Con ATTRIB, o hemos de declarar la variable y poner la expansión?

Novlucker

Lo he probado con ATTRIB y no se puede así directamente  :-\

Conocía practicamente todos los demás atributos, y la manera de obtenerlos/asignarlos en otros lenguajes, pero FILE_ATTRIBUTE_OFFLINE y FILE_ATTRIBUTE_REPARSE_POINT es la priemera vez que los veo  :o, muy bueno  ;)

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Sk9ITk5Z

Ni idea que existieran mas atributos.... gracias por la info...
Este es un pueblo de corazón extraviado, no quiere conocer mis caminos por eso no entraran en mi descanso.

0x0309

Me alegra que la información sirva.

Pasos para crear un archivo file.txt que for expanda a:
-rahscot-

Compilar el siguiente archivo en c y ejecutar en una carpeta dentro de un sistema de archivos ntfs.


#include <windows.h>
#include <stdio.h>

int main() {

    /* Fuente: http://www.codersource.net/win32_file_sample.html */
    HANDLE hFile;
    DWORD wmWritten;
    char strData[] = "Test";
   
    hFile = CreateFile(
            "file.txt"
            ,GENERIC_READ|GENERIC_WRITE
            ,FILE_SHARE_READ
            ,NULL
            ,OPEN_ALWAYS
            , /*ATRIBUTOS */
              FILE_ATTRIBUTE_READONLY
              | FILE_ATTRIBUTE_ARCHIVE
              | FILE_ATTRIBUTE_HIDDEN
              | FILE_ATTRIBUTE_SYSTEM
                /* Atributos Compreess no puede establecerse aqui */
              | FILE_ATTRIBUTE_OFFLINE
              | FILE_ATTRIBUTE_TEMPORARY

            ,NULL);
    WriteFile(hFile,strData,(DWORD)(sizeof(strData)),&wmWritten,NULL);
    CloseHandle(hFile);
   
   
    /* Perdon por los system, pero aún no he estudiado programacion win32 */
   
    /* ATRIBUTO COMPRESS */
    system(">nul compact.exe /c file.txt");
   
    /* EXPANDIR ATRIBUTOS CON CMD */
    system("@echo off & for %F in (file.txt) do echo.%~aF");
   
    getchar();

}



Es interesante que cuando for expande:
-rahscot-

attrib muestra:
attrib file.txt
A  SHR     C:\carpeta\file.txt

(hay dos espacios entre la primera A)

Para ver la d y la l :
Crear en C:\
el directorio o carpeta: creparse

Inicio-Ejecutar: compmgmt.msc

Ir a Administración de discos:
Clic derecho sobre propiedades de C:
Cambiar la letra y rutas de acceso a la unidad.
Agregar: Montar en la siguiente carpeta NTFS vacía:
Examinar: Expandir C: y seleccionar creparse.
Aceptar
Aceptar.
Luego en cmd:

for %F in (C:\creparse) do echo.%~aF


d-------l


la carpeta creparse tiene ahora el icono de un disco duro, y al entrar en ella se ve el contenido de C:


.;.

#7
    hFile = CreateFile(
            "file.txt"
            ,GENERIC_READ|GENERIC_WRITE
            ,FILE_SHARE_READ
            ,NULL
            ,OPEN_ALWAYS

¿?Pero que es eso tan largo?
¿No se hace así más corto?

FILE *origen

origen=fopen("origen.txt","r");


Solo son mejoras para el code, voy a probar si funciona.

Saludos!

.;.

Probado y si que funciona, pero entrando desde attrib solo ves A SHR         

Y esos espacios supongo que serán donde irían los demás atributos.

Por cierto para que copias un array,¿en el texto?

leogtz

Cita de: P4|3L0 en 20 Marzo 2009, 10:43 AM
 
¿?Pero que es eso tan largo?
¿No se hace así más corto?

FILE *origen

origen=fopen("origen.txt","r");

Solo son mejoras para el code, voy a probar si funciona.

Saludos!

Creo que es necesario usar el API.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com