2017-02-09 67 views

回答

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子句中的代碼將不被處理,並且故障標記將被設置,由條件操作者||(運行釣到下一個命令如果以前失敗)清除標誌變量。