2009-05-20 17 views
9

Sto scrivendo un file batch e ho bisogno di sapere se un file è di sola lettura. Come lo posso fare ?Test per l'attributo file nel file batch

So come ottenerli utilizzando il modificatore% ~ a, ma non so cosa fare con questo output. Dà qualcosa come -ra ------. Come posso analizzare questo in un file batch?

+0

Che tipo di file batch? bash, DOS ...? –

+0

File batch di Windows, come potete vedere da lui menzionando% ~ a. – Joey

risposta

12

Qualcosa del genere dovrebbe funzionare:

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

Quando eseguo questo ottengo il seguente 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 
+0

Non sapevo di ~ 1: 1 grazie! –

+0

Ok, funziona per 1 file ma se INPUT è un set, ATTRIBS avrà sempre lo stesso valore. Ho provato setLocal EnableDelayedExpansion ma si lamenta quando provo a usare! ATTRIBS: ~ 1,1! Cosa potevo fare ? –

+0

Grazie! Per qualche ragione usando! ATTRIBS: ~ 1,1! direttamente nel confronto non ha funzionato ma memorizzandolo in un'altra variabile funziona. –

5

Per testare un file specifico:

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

Per ottenere un elenco dei file di sola lettura

dir /ar * 

per ottenere una lista di lettura/scrittura di file

dir /a-r * 

Per elencare tutti i file e riferire se di sola lettura o lettura/scrittura:

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

EDIT

Patrick's answer non riesce se il nome del file contiene !. Questo può essere risolto commutando l'espansione ritardata on e off all'interno del ciclo, ma c'è un altro modo per sondare il valore %%~aF senza ricorrere a espansione in ritardo, o addirittura una variabile d'ambiente:

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 
) 
) 
Problemi correlati