2017-02-09 6 views
1

Я хочу, чтобы пакетный скрипт выполнял определенные команды в зависимости от файловых атрибутов файла. Например:Если атрибут File = this делает это в пакете

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! 
) 

Спасибо!

+0

Спасибо всем, кто ответил! :) – ditheredtransparency

ответ

2

Тип 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. Он не найдет файл, если вы используете подстановочные знаки.

2
@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-м положениях атрибутов. Если они установлены, вам необходимо проверить их в этом порядке.

2
@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 не будут обработаны и флаг сбоя будет установлен, пойманной с помощью условного оператора || (выполнения следующая команда, если предыдущее не удалось), чтобы очистить переменную флага.