2009-05-20 13 views
9

Piszę plik wsadowy i muszę wiedzieć, czy plik jest tylko do odczytu. Jak mogę to zrobić ?Testowanie atrybutu pliku w pliku wsadowym

Wiem, jak je uzyskać za pomocą modyfikatora% ~ a, ale nie wiem, co zrobić z tym wynikiem. Daje coś w rodzaju -ra ------. Jak mogę przeanalizować to w pliku wsadowym?

+0

Jakie pliku wsadowym? bash, DOS ...? –

+0

Pliki wsadowe Windows, jak widać od niego, wspominając% ~ a. – Joey

Odpowiedz

12

Coś jak to powinno działać:

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

Gdy uruchomię to pojawia się następujący komunikat:

 
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

Nie wiedziałem o ~ 1: 1 dzięki! –

+0

Ok to działa dla 1 pliku, ale jeśli INPUT jest zbiorem, ATTRIBS zawsze będzie mieć tę samą wartość. Próbowałem setLocal EnableDelayedExpansion, ale narzeka, gdy próbuję użyć! ATTRIBS: ~ 1,1! Co mógłbym zrobić ? –

+0

Dzięki! Z jakiegoś powodu za pomocą! ATTRIBS: ~ 1,1! bezpośrednio w porównaniu nie działało, ale przechowywanie go w innej zmiennej działa. –

5

przetestować konkretny plik:

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

dostać lista plików tylko do odczytu

dir /ar * 

Aby uzyskać listę odczytu/zapisu plików

dir /a-r * 

Aby wyświetlić listę wszystkich plików i zgłosić, czy tylko do odczytu lub odczytu/zapisu:

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

EDIT

Patrick's answer kończy się niepowodzeniem, jeśli nazwa pliku zawiera !. Problem ten można rozwiązać poprzez przełączanie opóźnione ekspansji i wyłączanie wewnątrz pętli, ale nie ma innego sposobu, aby badać wartość %%~aF bez uciekania się do opóźnionego ekspansji, a nawet zmienna:

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 
) 
) 
Powiązane problemy