Comment vérifier si un fichier / répertoire est accessible en écriture dans des scripts de commandes

En bash, j’utiliserais

[ -w ... ] 

Qu’est-ce que l’équivalent pour les fichiers de commandes Windows?

Pour autant que je sache, vous pouvez savoir si le fichier existe ou non , mais il n’y a aucun moyen de savoir s’il est accessible en écriture, si ce n’est d’essayer d’y écrire. Il ne s’agit pas seulement de ne pas avoir le drapeau R ; les permissions réseau et NTFS sont également impliquées (et probablement aussi les stratégies de groupe).

Si vous pouvez réécrire votre code, vous pouvez capturer le code retour de l’opération d’écriture à travers le niveau d’ erreur .

Désolé les gars pour sonner ici ..

Ce n’est peut-être pas 100% ce que vous recherchez, mais je l’ai utilisé avec des fichiers journaux en cours d’utilisation pour Apache Tomcat et cela fonctionne parfaitement.

Merci à @dbenham pour son code génial! https://stackoverflow.com/a/10520609/175063

 SETLOCAL ENABLEDELAYEDEXPANSION REM TOMCAT LOGS FOR /r "D:\logs" %%X IN (*) DO ( SET FileName=%%~nxX 2>nul ( >>D:\logs\!FileName!" (call )) && ( REM DO STUFF HERE SET ModDt=%%~tX FOR /f "tokens=1-3 delims=.:/ " %%j IN ("!ModDt!") DO SET FDate=%%l-%%j-%%k&Set RegDate=%%j-%%k-%%l IF "%CurrentDate%" NEQ "!FDate!" ( IF %%~zX GTR 0 ( ECHO ARCHIVING "D:\logs\!FileName!" >> %logfile% 7za.exe -tzip -ya "D:\Zips\%COMPUTERNAME%-Tomcat-!RegDate!-compressed.zip" "D:\logs\!FileName!" && ( DEL /Q "D:\logs\!FileName!" ) || ( if "%ERRORLEVEL%" == "2" ( echo Zipping failed ^(exit status %ERRORLEVEL%^). Trying again in 5 seconds... ) else ( echo Zip completed with warnings ^(most likely because a file was locked by another echo process and had to be skipped^). Trying again in 5 seconds... ) del "D:\Zips\%COMPUTERNAME%-Tomcat-!RegDate!-compressed.zip" >NUL 2>&1 PING 0.0.0.0 -n 6 -w 1000 >NUL ) ) ) REM END OF UNLOCKED ZONE ) || ( ECHO FILE IS LOCKED ) ) 

vous pouvez le faire comme ça en utilisant vbscript

 Set objFS=CreateObject("Scripting.FileSystemObject") Set objArgs = WScript.Arguments strFile = objArgs(0) Set objFile = objFS.GetFile(strFile) If Not objFile.Atsortingbutes And 1 Then WScript.Echo "The file is Read/Write." Else WScript.Echo "The file is Read-only." End If 

enregistrer sous check.vbs et sur la ligne de commande

 c:\test> cscript //nologo check.vbs myfile 
 ls -l foo.txt 

output -r – r – r– pour un fichier inscriptible, sorties -rw-r – r– pour un fichier accessible en écriture

vous pouvez stocker la valeur et vérifier si le troisième caractère est “w” pour inscriptible ou “-” pour non accessible en écriture.

en utilisant une syntaxe comme %myVar:~2,1% dans une instruction conditionnelle.

Je ne suis pas sûr que cela dépende du système d’exploitation.