windows 如何在批处理脚本中检查文件/目录是否可写

pgky5nke  于 2023-08-07  发布在  Windows
关注(0)|答案(6)|浏览(140)

在bash中,我会使用

[ -w ... ]

字符串
Windows批处理文件的等效值是什么?

irlmq6kh

irlmq6kh1#

据我所知,你可以找出文件exists or not,但没有办法知道它是否是可写的,除了尝试写它。这不仅仅是没有R旗帜的问题;还涉及网络和NTFS权限(可能还有组策略)。
如果您可以重写代码,则可以通过errorlevel捕获写操作的返回代码。

iezvtpos

iezvtpos2#

对不起,各位在这里打岔。
这可能不是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
    )
)

字符串

b4wnujal

b4wnujal3#

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

  • 锁定 bat *
(
  echo.123
  pause
) > "1.txt"

字符串

  • 测试 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 allEveryone

yvfmudvl

yvfmudvl4#

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

mlnl4t2r

mlnl4t2r5#

我发现的最可靠的方法是将NUL复制到目标目录中的文件。
如果该目录不存在或当前用户无法写入该目录,则将以1退出。
我使用/B作为NUL是二进制的,使用/Y覆盖现有的文件。

copy /Y /B NUL "c:\test\test.txt"
echo %ERRORLEVEL%

字符串

lnvxswe2

lnvxswe26#

ls -l foo.txt

字符串
outputs -r--r--r--对于不可写文件outputs -rw-r--r--对于可写文件
您可以存储该值并检查第三个字符是否为“w”(可写)或“-”(不可写)。
在条件语句中使用像%myVar:~2,1%这样的语法。
不确定这将如何依赖于操作系统。

相关问题