Test de l'attribut de fichier dans le fichier batch
-
23-08-2019 - |
Question
J'écris un fichier de commandes et je dois savoir si un fichier est en lecture seule. Comment puis-je faire?
Je sais comment les obtenir en utilisant le% ~ un modificateur mais je ne sais pas quoi faire avec cette sortie. Il donne quelque chose comme -ra ------. Comment puis-je analyser ce dans le fichier batch?
La solution
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 je reçois 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
Autres conseils
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 une liste de fichiers en lecture seule
dir /ar *
Pour obtenir une liste des fichiers de lecture / écriture
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
réponse de Patrick échoue si le nom de fichier contient !
. Ceci peut être résolu en faisant basculer l'expansion retardée sous et hors tension dans la boucle, mais il y a un autre moyen de sonder la valeur de %%~aF
sans avoir recours à expansion retardée, ou même 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
)
)