2009-05-20 27 views
9

Estoy escribiendo un archivo por lotes y necesito saber si un archivo es de solo lectura. Cómo puedo hacer eso ?Prueba del atributo de archivo en el archivo por lotes

Sé cómo usar el modificador% ~ a, pero no sé qué hacer con esta salida. Da algo como -ra ------. ¿Cómo puedo analizar esto en un archivo por lotes?

+0

¿Qué tipo de archivo por lotes? Bash, DOS ...? –

+0

Windows archivos por lotes, como se puede ver de él mencionando% ~ a. – Joey

Respuesta

12

Algo como esto debería funcionar:

@echo OFF 

SETLOCAL enableextensions enabledelayedexpansion 

set INPUT=test* 

for %%F in (%INPUT%) do (
    set ATTRIBS=%%~aF 
    set CURR_FILE=%%~nxF 
    set READ_ATTRIB=!ATTRIBS:~1,1! 

    @echo File: !CURR_FILE! 
    @echo Attributes: !ATTRIBS! 
    @echo Read attribute set to: !READ_ATTRIB! 

    if !READ_ATTRIB!==- (
     @echo !CURR_FILE! is read-write 
    ) else (
     @echo !CURR_FILE! is read only 
    ) 

    @echo. 
) 

Cuando ejecuto esto me sale el siguiente resultado:

 
File: test.bat 
Attributes: --a------ 
Read attribute set to: - 
test.bat is read-write 

File: test.sql 
Attributes: -ra------ 
Read attribute set to: r 
test.sql is read only 

File: test.vbs 
Attributes: --a------ 
Read attribute set to: - 
test.vbs is read-write 

File: teststring.txt 
Attributes: --a------ 
Read attribute set to: - 
teststring.txt is read-write 
+0

No sabía acerca de ~ 1: 1 gracias! –

+0

Ok, esto está funcionando para 1 archivo, pero si INPUT es un conjunto, ATTRIBS siempre tendrá el mismo valor. Probé SetLocal EnableDelayedExpansion pero se queja cuando trato de usar! ATTRIBS: ~ 1,1! Qué puedo hacer ? –

+0

Gracias! Por alguna razón usando! ATTRIBS: ~ 1,1! directamente en la comparación no funcionó, pero el almacenamiento en otra variable funciona. –

5

Para probar un archivo específico:

dir /ar yourFile.ext >nul 2>nul && echo file is read only || echo file is NOT read only 

Para obtener una lista de archivos de solo lectura

dir /ar * 

Para obtener una lista de lectura/escritura de archivos

dir /a-r * 

Para una lista de todos los archivos e informar si sólo lectura o de lectura/escritura:

for %%F in (*) do dir /ar "%%F" >nul 2>nul && echo Read Only: %%F|| echo Read/Write: %%F 

EDITAR

Patrick's answer falla si el nombre del archivo contiene !. Esto se puede resolver alternando expansión retardada y fuera dentro del bucle, pero hay otra forma de estudiar el valor %%~aF sin recurrir a la expansión retardada, o incluso una variable de entorno:

for %%F in (*) do for /f "tokens=1,2 delims=a" %%A in ("%%~aF") do (
    if "%%B" equ "" (
    echo "%%F" is NOT read only 
) else (
    echo "%%F" is read only 
) 
) 
Cuestiones relacionadas