如果 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
子句中的代码,并且会设置失败标志,由条件运算符 ||
(运行 如果前一个命令失败则下一个命令)清除标志变量。
我想要一个批处理脚本来根据文件的文件属性执行特定的命令。例如:
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
子句中的代码,并且会设置失败标志,由条件运算符 ||
(运行 如果前一个命令失败则下一个命令)清除标志变量。