La meilleure façon de vérifier si le répertoire est accessible en écriture à BAT script?
Comment puis-je vérifier si un répertoire est accessible en écriture par l'utilisateur en cours d'exécution à partir d'un script batch?
Voici ce que j'ai essayé jusqu'à présent:
> cd "%PROGRAMFILES%"
> echo. > foo
Access is denied.
> echo %ERRORLEVEL%
0
Ok, alors comment sur...
> copy NUL > foo
Access is denied.
> echo %ERRORLEVEL%
0
Pas que ce soit? Alors que penser de...
> copy foo bar
Access is denied.
0 file(s) copied.
> echo %ERRORLEVEL%
1
Cela fonctionne, mais il casse si le fichier n'existe pas.
J'ai lu quelque chose au sujet des commandes internes pas de paramètre ERRORLEVEL, mais copy
semble être manifestement à le faire dans le dernier cas.
- oh oui... environnement windows va vous déranger avec ça. De nombreuses commandes n'ont pas de rendement %errorlevel% correctement... ainsi que de nombreux installé des applications qui utilisent des arguments de ligne de commande. =D
- haha, ouais... pour ne pas mentionner la mince proverbiale que la glace est devis et des chemins contenant des espaces. J'ai eu recours à l'aide de 8.3 chemins d'accès. 😉
- vous pourriez avoir plus de chance avec cette question, dans la sœur du site .. superuser.com
- Qu'est-ce que le
something
que vous lisez sur les commandes internes? Auriez-vous un lien à portée de main? - cela m'a beaucoup aidé [comment-faire-vérifier-en-ligne de commande-si-un-compte tenu de fichier ou de répertoire-est-verrouillé-utilisé-par-tout][1] [1]: stackoverflow.com/questions/10518151/...
InformationsquelleAutor batshcrazy | 2011-09-01
Vous devez vous connecter pour publier un commentaire.
Certainement l'exécution d'une commande à l'encontre de la trouver si sa refusé est le moyen le plus facile de le faire. Vous pouvez également utiliser CACLS pour trouver exactement ce que les autorisations sont ou ne sont pas. Voici un échantillon.
Dans CMD type
CACLS /?
CACLS "filename"
vous donnera ce que les autorisations en cours est autorisé sur le fichier.R = Read, W = Écriture, C = Changer (de même que pour écrire?), F = accès Complet.
EDIT: Vous pouvez utiliser le nom de répertoire ainsi.
De sorte à faire un chèque, vous:
cacls foldername /P %computername%\%username%:R
Maintenant CD et neECHO hello>file.txt
Vous aurez un accès refusé.Vous pouvez écrire
copy %0 foo
pour copier le fichier de commandes lui-même.Cela existera toujours.
N'oubliez pas de supprimer le fichier par la suite, et assurez-vous que vous ne pas écraser un fichier existant par ce nom.
Il devrait y avoir une meilleure façon de faire cela, mais je ne sais pas du tout.
MODIFIER: Mieux encore, essayez de
mkdir foo
.Dans le cas où le fichier de commandes est en cours d'exécution hors d'un réseau (ou s'il est très grand), ça peut être plus rapide.
copy NUL foo
et obtenir le même résultat.copy nul foo
, par exemple.j'ai trouvé que l'exécution de
copy
dans le fichier de lot fait l'écho d'une erreur sur STDERR, mais à gauche%ERRORLEVEL%
intacte (toujours 0). donc la solution a été de combiner la commande avec un sursis d'exécution deset
.c'est testé sur XP et 7 et semble fonctionner de manière fiable.
Une extension de Mechaflash's réponse, et résout le problème de remplacer le fichier par la génération d'un nom de fichier unique pour le "test" fichier.
(
%~1
est le répertoire d'entrée)EDIT: Si vous voulez une option sécuritaire