En bash, j'utiliserComment vérifier si un fichier/dir est inscriptible dans les scripts batch
[ -w ... ]
Quel est l'équivalent pour les fichiers de traitement par lots de Windows?
En bash, j'utiliserComment vérifier si un fichier/dir est inscriptible dans les scripts batch
[ -w ... ]
Quel est l'équivalent pour les fichiers de traitement par lots de Windows?
Pour autant que je sache, vous pouvez savoir si le fichier exists or not, mais il n'y a aucun moyen de savoir si c'est écrit, à part essayer d'écrire dessus. Il ne s'agit pas seulement de ne pas avoir le drapeau R; Les autorisations 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 de retour de l'opération d'écriture au errorlevel.
vous pouvez le faire comme ceci en utilisant vbscript
Set objFS=CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
strFile = objArgs(0)
Set objFile = objFS.GetFile(strFile)
If Not objFile.Attributes 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
Les ACL sont également impliquées. Voir la réponse d'Álvaro. – Joey
Désolé pour les gens sonnant ici ..
Cela peut ne pas être à 100% ce que vous cherchez, mais j'ai utilisé cela avec en utiliser les fichiers journaux pour Apache Tomcat et il fonctionne parfaitement tout à fait.
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 -y a "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
)
)
ls -l foo.txt
sorties -r - r - r-- pour un fichier non inscriptible sorties -rw-r - r-- pour un fichier inscriptible
vous pouvez stocker la value et vérifie si le 3ème caractère est "w" pour writable ou "-" pour non writable.
en utilisant une syntaxe similaire à %myVar:~2,1%
dans une instruction conditionnelle.
ne sait pas comment cela dépendrait du système d'exploitation.
'ls -l' fonctionnerait avec linux mais pas avec windows – jeb
+1 pour mentionner les permissions. Ce n'est certainement pas juste une question d'indicateur en lecture seule qui serait triviale à vérifier avec '% ~ ax' ou quelque chose comme ça. – Joey