Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Testing for file attribute in batch file

I'm writing a batch file and I need to know if a file is read only. How can I do that ?

I know how to get them using the %~a modifier but I don't know what to do with this output. It gives something like -ra------. How can I parse this in batch file ?

like image 423
Eric Fortin Avatar asked May 20 '09 14:05

Eric Fortin


2 Answers

Something like this should work:

@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.
)

When I run this I get the following output:

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
like image 105
Patrick Cuff Avatar answered Sep 23 '22 14:09

Patrick Cuff


To test a specific file:

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

To get a list of read only files

dir /ar *

To get a list of read/write files

dir /a-r *

To list all files and report whether read only or read/write:

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

EDIT

Patrick's answer fails if the file name contains !. This can be solved by toggling delayed expansion on and off within the loop, but there is another way to probe the %%~aF value without resorting to delayed expansion, or even an environment variable:

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
  )
)
like image 24
dbenham Avatar answered Sep 23 '22 14:09

dbenham