Как проверить, является ли файл/DIR, который можно записать в пакетные сценарии
-
22-09-2019 - |
Вопрос
В Bash я бы использовал
[ -w ... ]
Что эквивалентно для пакетных файлов Windows?
Решение
Насколько я знаю, вы можете узнать, что файл существует или нет, но нет никакого способа узнать, можно ли записаться, кроме попыток написать на нем. Это не только вопрос не иметь р флаг; Разрешения на сетевых и NTFS также участвуют (и, вероятно, групповая политика тоже).
Если вы можете переписать свой код, вы можете захватить код возврата операции записи. Ошибка.
Другие советы
Извините, ребята за то, что вышли сюда ..
Это может быть не на 100% то, что вы ищете, но я использовал это с использованием файлов журналов для Apache Tomcat, и это работает абсолютно идеально.
Спасибо @dbenham за его потрясающий код! 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
)
)
Вы можете сделать это так, используя 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
Сохранить как check.vbs и в командной строке
c:\test> cscript //nologo check.vbs myfile
ls -l foo.txt
Выходы -R--r--r-- Для выходов файлов не записываемых-RW-R-R- для файла для записи
Вы можете сохранить значение и проверить, является ли 3-й персонаж «w» для записи или «-», чтобы не записать.
Использование некоторого синтаксиса как %myVar:~2,1%
в условном заявлении.
Не уверен, насколько это будет зависимой от ОС.