如果 File attribute=this 批量执行此操作

If File attribute=this do this in batch

我想要一个批处理脚本来根据文件的文件属性执行特定的命令。例如:

If attrib %windir%\system32\bcrypt.dll RH (
      echo This is read only, and hidden!
) else (
      echo These file attributes don't match what I was looking for!
)

谢谢!

@echo off

setlocal enableDelayedExpansion
for /f "tokens=* delims=" %%a in ('attrib "%windir%\system32\bcrypt.dll"') do (
    set "attributes=%%a"
    set "attributes=!attributes:~0,13!"
)

set "HR=%attributes:~4,2%"
if "!HR!" equ "HR" (
    echo attributes matching
) else (
    echo attributes not matching
)

H和R在属性的第5和第6位置。如果已设置,您需要按此顺序检查它们。

键入 FOR /? 以获取有关如何获取文件属性的信息。对于分配给文件的 FOR 变量,例如 %f,您可以使用 %~af 获取其属性。因此,要检查它是否具有 R 和 H 属性:

setlocal enabledelayedexpansion
for %%f in ("%windir%\system32\bcrypt.dll") do (
    set attributes=%%~af
    if "!attributes:h=!" neq "!attributes!" echo File is hidden.
    if "!attributes:r=!" neq "!attributes!" echo File is read-only.
)

警告:如果文件是隐藏的,您需要在 for 命令中明确命名。如果您使用通配符,它​​将找不到该文件。

@echo off
    setlocal enableextensions disabledelayedexpansion

    for %%a in ("%windir%\system32\bcrypt.dll") do (

        set "RO_AND_H=1"
        ( for /f "tokens=2 delims=r" %%b in ("%%~aa") do break ) || set "RO_AND_H="
        ( for /f "tokens=2 delims=h" %%b in ("%%~aa") do break ) || set "RO_AND_H="

        if defined RO_AND_H (
            echo File is readonly and hidden
        ) else (
            echo File attributes don't match
        )
    )

如前所述,for 可替换参数的 ~a 修饰符 returns 文件的属性列表,一个包含九个破折号的字符串,其中每个破折号都被一个字母替换为表示属性的存在(更多 here)。

 FILE_ATTRIBUTE_DIRECTORY     d-------- 
 FILE_ATTRIBUTE_READONLY      -r------- 
 FILE_ATTRIBUTE_ARCHIVE       --a------ 
 FILE_ATTRIBUTE_HIDDEN        ---h----- 
 FILE_ATTRIBUTE_SYSTEM        ----s---- 
 FILE_ATTRIBUTE_COMPRESSED    -----c--- 
 FILE_ATTRIBUTE_OFFLINE       ------o-- 
 FILE_ATTRIBUTE_TEMPORARY     -------t- 
 FILE_ATTRIBUTE_REPARSE_POINT --------l
 FILE_ATTRIBUTE_NORMAL        --------- 

对于每个必需的属性,代码使用所需属性作为分隔符来标记此字符串,并尝试检索第二个标记。

如果设置了该属性,则列表一分为二,会有第二个标记,因此执行for /f命令的do子句中的代码(break 只是用来什么都不做)。

如果该属性不存在,则不会拆分该行,不会有第二个标记,不会处理 do 子句中的代码,并且会设置失败标志,由条件运算符 ||(运行 如果前一个命令失败则下一个命令)清除标志变量。