@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
)
)
Как уже отмечалось, то ~a
модификатор for
заменяемый параметр возвращает список атрибутов файла, строку с девятью тире, где каждый из них заменяется буквой, чтобы сигнализировать наличие атрибута (более 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
не будут обработаны и флаг сбоя будет установлен, пойманной с помощью условного оператора ||
(выполнения следующая команда, если предыдущее не удалось), чтобы очистить переменную флага.
Спасибо всем, кто ответил! :) – ditheredtransparency