【问题标题】:How to check whether a file/dir is writable in batch scripts如何在批处理脚本中检查文件/目录是否可写
【发布时间】:2011-01-01 06:45:47
【问题描述】:

在 bash 中,我会使用

[ -w ... ]

Windows 批处理文件的等价物是什么?

【问题讨论】:

标签: windows batch-file writable


【解决方案1】:

据我所知,你可以查出文件exists or not是否可以写,但除了尝试在上面写之外,没有办法知道它是否可写。这不仅仅是没有 R 标志的问题;还涉及网络和 NTFS 权限(可能还涉及组策略)。

如果你可以重写你的代码,你可以通过errorlevel捕获写操作的返回码。

【讨论】:

  • +1 用于提及权限。这绝对不仅仅是只读标志的问题,用%~ax 或类似的东西检查是微不足道的。
  • 令人惊讶的是,经过一段时间后,可接受的 stackoverflow 答案如何变得不正确:stackoverflow.com/questions/1999988/…
  • @Andry 您能否详细说明此答案中的哪些信息已过时?除非我遗漏了什么,否则您共享的链接仅显示如何尝试写入文件以确定它是否成功。
  • @Álvaro González 只要访问时间不变,它就不会尝试写入,因此有一种方法可以知道它是否可写而无需实际尝试写入。
【解决方案2】:

对不起,在这里插话的人..

这可能不是您所寻找的 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
    )
)

【讨论】:

    【解决方案3】:

    这是旧的,但我没有在这里找到它:

    lock.bat

    (
      echo.123
      pause
    ) > "1.txt"
    

    test.bat

    move /Y "1.txt" "1.txt" >nul 2>nul
    echo.%ERRORLEVEL%
    

    move 不会更改文件的创建/更改/访问时间。

    https://www.dostips.com/forum/viewtopic.php?t=5542


    要检查目录的访问权限,您可以使用rename 命令以相同的方式:

    rename "path\1.txt" "1.txt" >nul 2>nul
    echo.%ERRORLEVEL%
    

    要测试它,只需添加 path\ - deny all for Everyone

    【讨论】:

      【解决方案4】:

      你可以使用 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
      

      【讨论】:

      • ACL 也参与其中。请参阅 Álvaro 的回答。
      【解决方案5】:
      ls -l foo.txt
      

      输出 -r--r--r-- 用于不可写文件 输出 -rw-r--r-- 用于可写文件

      您可以存储该值并检查第三个字符是“w”表示可写还是“-”表示不可写。

      在条件语句中使用 %myVar:~2,1% 之类的语法。

      不确定这将如何依赖操作系统。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        • 1970-01-01
        • 2013-04-11
        • 2015-07-09
        • 1970-01-01
        相关资源
        最近更新 更多