Le meilleur moyen de vérifier si le répertoire est accessible en écriture dans le script BAT?

Comment puis-je vérifier si un répertoire est accessible en écriture pour l’utilisateur exécutant à partir d’un script batch?

Voici ce que j’ai essayé jusqu’ici:

> cd "%PROGRAMFILES%" > echo. > foo Access is denied. > echo %ERRORLEVEL% 0 

Ok, alors qu’en est-il de …

 > copy NUL > foo Access is denied. > echo %ERRORLEVEL% 0 

Pas ça non plus? Alors qu’en est-il de …

 > copy foo bar Access is denied. 0 file(s) copied. > echo %ERRORLEVEL% 1 

Cela fonctionne, mais ça casse si le fichier n’existe pas.

J’ai lu quelque chose à propos des commandes internes ne définissant pas ERRORLEVEL, mais la copy semble évidemment le faire dans le dernier cas.

Vous pouvez écrire la copy %0 foo pour copier le fichier batch lui-même.
Cela existera toujours.

N’oubliez pas de supprimer le fichier par la suite et de vous assurer que vous ne remplacez pas un fichier existant par ce nom.

Il devrait y avoir une meilleure façon de le faire, mais je n’en connais aucune.

EDIT : Mieux encore, essayez mkdir foo .
Si le fichier de commandes est exécuté sur un réseau (ou s’il est très volumineux), cela peut être plus rapide.

Exécuter définitivement une commande à son encontre pour trouver si son refus est le moyen le plus simple de le faire. Vous pouvez également utiliser CACLS pour trouver exactement quelles sont les permissions ou non. Voici un exemple.

En CMD type CACLS /?

CACLS "filename" vous donnera ce que les permissions actuelles sont autorisées sur le fichier. R = Lecture, W = Ecriture, C = Changement (identique à écriture?), F = Accès total.

EDIT: Vous pouvez également utiliser le nom du répertoire.

Donc, pour faire un chèque, vous devriez:

 FOR /F "USEBACKQ tokens=2 delims=:" %%F IN (`CACLS "filename" ^| FIND "%username%"`) DO ( IF "%%F"=="W" (SET value=true && GOTO:NEXT) IF "%%F"=="F" (SET value=true && GOTO:NEXT) IF "%%F"=="C" (SET value=true && GOTO:NEXT) SET value=false ) ECHO This user does not have permissions to write to file. GOTO:EOF :NEXT ECHO This user is able to write to file. 

J’ai trouvé que l’exécution de la copy dans le fichier de commandes faisait écho à une erreur sur STDERR, mais laissait %ERRORLEVEL% intact (toujours 0). la solution de contournement consistait donc à combiner la commande avec une exécution conditionnelle de set .

 copy /Y NUL "%FOLDER%\.writable" > NUL 2>&1 && set WRITEOK=1 IF DEFINED WRITEOK ( rem ---- we have write access ---- ... ) else ( rem ---- we don't ---- ... ) 

Ceci est testé sur XP et 7 et semble fonctionner de manière fiable.

 set testdir=%programfiles% set myguid={A4E30755-FE04-4ab7-BD7F-E006E37B7BF7}.tmp set waccess=0 echo.> "%testdir%\%myguid%"&&(set waccess=1&del "%testdir%\%myguid%") echo write access=%waccess%