2009-05-20 8 views
9

J'écris un fichier de commandes et j'ai besoin de savoir si un fichier est en lecture seule. Comment puis je faire ça ?Test de l'attribut de fichier dans le fichier de commandes

Je sais comment les obtenir en utilisant le modificateur% ~ a mais je ne sais pas quoi faire avec cette sortie. Cela donne quelque chose comme -ra ------. Comment puis-je analyser cela dans un fichier batch?

+0

Quel type de fichier batch? bash, DOS ...? –

+0

Fichiers batch Windows, comme vous pouvez le voir en mentionnant% ~ a. – Joey

Répondre

12

Quelque chose comme cela devrait fonctionner:

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

Quand je lance ce que j'obtenir la sortie suivante:

 
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

Je ne savais pas sur le ~ 1: 1 merci! –

+0

Ok cela fonctionne pour 1 fichier mais si INPUT est un ensemble, ATTRIBS aura toujours la même valeur. J'ai essayé setLocal EnableDelayedExpansion mais il se plaint quand j'essaie d'utiliser! ATTRIBS: ~ 1,1! Que pouvais-je faire ? –

+0

Merci! Pour une raison quelconque, en utilisant! ATTRIBS: ~ 1,1! directement dans la comparaison n'a pas fonctionné, mais le stocker dans une autre variable fonctionne. –

5

Pour tester un fichier spécifique:

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

Pour obtenir un liste des fichiers en lecture seule

dir /ar * 

Pour obtenir une liste de lecture/écriture des fichiers

dir /a-r * 

Pour lister tous les fichiers et indiquer si en lecture seule ou lecture/écriture:

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

EDIT

Patrick's answer échoue si le nom de fichier contient !. Ceci peut être résolu en activant l'expansion retardée et hors dans la boucle, mais il y a une autre façon de sonder la valeur %%~aF sans avoir recours à l'expansion retardée, voire une variable d'environnement:

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 
) 
) 
Questions connexes