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

时间:2017-02-09 21:58:50

标签: batch-file attr

我希望批处理脚本根据文件的文件属性执行特定命令。例如:

The requested route [/routeexemple/users/] has not been mapped in Spark

谢谢!

3 个答案:

答案 0 :(得分:3)

键入FOR以获取有关如何获取文件属性的信息。对于分配给文件的%f变量(例如%~af),您可以使用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. ) 获取其属性。因此,要检查它是否具有R和H属性:

for

警告:如果文件是隐藏的,则需要在$query = "UPDATE `tablename` SET unsubscribed = 1 WHERE email = (SELECT email from `tablename` WHERE id = " . $id . ") "; 命令中明确命名。如果使用通配符,则无法找到该文件。

答案 1 :(得分: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 :(得分: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        --------- 

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

如果设置了属性,列表将被拆分为两个,并且会有第二个令牌,因此执行do命令的for /f子句中的代码(break用来做什么都没用。

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