Как проверить, является ли файл/DIR, который можно записать в пакетные сценарии

StackOverflow https://stackoverflow.com/questions/1999988

  •  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% в условном заявлении.

Не уверен, насколько это будет зависимой от ОС.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top