2009-05-20 2 views
9

Я пишу командный файл, и мне нужно знать, является ли файл только для чтения. Как я могу это сделать ?Тестирование атрибута файла в пакетном файле

Я знаю, как получить их с помощью модификатора% ~ a, но я не знаю, что делать с этим выходом. Это дает что-то вроде -ra ------. Как я могу разобрать это в пакетном файле?

+0

Какой пакетный файл? bash, DOS ...? –

+0

Пакетные файлы Windows, как вы можете видеть у него упоминание% ~ a. – Joey

ответ

12

Что-то, как это должно работать:

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

Когда я запускаю это я получаю следующий результат:

 
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

Я не знал о ~ 1: 1 спасибо! –

+0

Хорошо, это работает для 1 файла, но если INPUT является набором, ATTRIBS всегда будет иметь одинаковое значение. Я попробовал setLocal EnableDelayedExpansion, но он жалуется, когда я пытаюсь использовать! ATTRIBS: ~ 1,1! Что я мог сделать ? –

+0

Спасибо! По какой-то причине использование! ATTRIBS: ~ 1,1! прямо в сравнении не работало, но хранение его в другой переменной работает. –

5

Для проверки конкретного файла:

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

Чтобы получить Список только для чтения файлов

dir /ar * 

Чтобы получить список чтения/записи файлов

dir /a-r * 

Чтобы получить список всех файлов и сообщать ли только для чтения или чтения/записи:

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

EDIT

Patrick's answer сбой, если имя файла содержит !. Эту проблему можно решить, переключая замедленное разложение и выключается в течение цикла, но есть и другой способ, чтобы исследовать значение %%~aF, не прибегая к задержке расширения, или даже переменная окружения:

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 
) 
) 
Смежные вопросы