Como verificar se um arquivo/diretor é gravável em scripts em lote
-
22-09-2019 - |
Pergunta
Em Bash, eu usaria
[ -w ... ]
Qual é o equivalente para arquivos em lote do Windows?
Solução
Até onde eu sei, você pode descobrir se o arquivo existe ou não, mas não há como saber se é escrito, além de tentar escrever nele. Não é apenas uma questão de não ter o R bandeira; As permissões de rede e NTFs também estão envolvidas (e provavelmente também políticas de grupo).
Se você puder reescrever seu código, poderá capturar o código de retorno da operação de gravação, a ErrorLevel.
Outras dicas
Desculpe pessoal por brincar aqui ..
Isso pode não ser 100% o que você está procurando, mas eu usei isso com arquivos de log em uso para o Apache Tomcat e funciona absolutamente perfeitamente.
Obrigado a @dbenham por seu código incrível! 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
)
)
você pode fazer assim usando 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
salvar como check.vbs e na linha de comando
c:\test> cscript //nologo check.vbs myfile
ls -l foo.txt
Saídas -r-r-para um arquivo não gravável Saídas -rw-r-r-- para um arquivo gravável
Você pode armazenar o valor e verificar se o terceiro caractere é "W" para gravidade ou "-" para não ser gravável.
usando alguma sintaxe como %myVar:~2,1%
em uma declaração condicional.
Não tenho certeza de como isso seria dependente do OS.