Windows 将文件夹中包含一行的所有文件设为只读

Windows 将文件夹中包含一行的所有文件设为只读

我的目录中有一些文件带有以下注释:

// _READONLY_

我想使用批处理脚本将所有这些文件设置为只读。

我发现这个命令可以设置只读状态:

attrib +r

我知道有一个findstr命令,但我很难将两者串联起来(双关语:)来做我想要做的事情。

答案1

这是一个命令行和批处理脚本例如使用为/F.txt循环为具有匹配字符串的单个目录中的所有文件设置只读属性"// _READONLY_"

这里有几件事要提一下……

  • 选项FOR /F块用作:分隔符,以在每次迭代中分割该值

  • 选项FOR /F块使用12标记在每次迭代之前获取值(因此没有前面冒号的驱动器号和没有前面冒号减去驱动器号的完整文件路径)在这些示例中:用作%a%b

  • 命令FOR /F参数块:在第一个和第二个标记值之间放置一个冒号,以再次创建文件路径,因为它在冒号上被拆分,否则将被省略

    • 这就是attrib +r命令处理每个匹配文件的方式,它将连接%a值、冒号,并且%b中间没有空格(例如%a:%b
  • 将每个递归子目录值放入FOR /R组合中,并传递给后续FOR /F命令,以搜索所有.txt包含匹配字符串的文件

    一个具有递归的错误FINDSTR和一个FOR /R可以缓解的错误......

    FINDSTR应该能够使用该/S 选项递归目录树。但是,如果文件系统启用了短名称,则存在一个严重的错误,可能会导致跳过某些文件。请参阅Windows FINDSTR 命令有哪些未记录的功能和限制?了解更多信息。查找部分标题BUG - 较短的 8.3 文件名可能会破坏 /D 和 /S 选项s”在那个答案中。德本汉姆

命令行

笔记:第一行命令FOR /F是获取所有父级文件夹文件。第二行命令FOR /R是获取所有下级子文件夹及其文件以及父文件夹。

FOR /F "DELIMS=: TOKENS=1,2" %a IN ('findstr C:"// _READONLY_" "C:\Folder\Path\*.txt"') DO attrib +r "%a:%b"
FOR /R "C:\Folder\Path\" %D IN (.) DO (FOR /F "DELIMS=: TOKENS=1,2" %a IN ('findstr C:"// _READONLY_" "%~fdD\*.txt"') DO (attrib +r "%~a:%~b"))

批处理脚本

笔记:%%将批处理脚本中的百分号与FOR循环变量占位符加倍%%a%%b这样,命令行作为批处理脚本运行通常就和FOR循环一样简单。

FOR /F "DELIMS=: TOKENS=1,2" %%a IN ('findstr C:"// _READONLY_" "C:\Folder\Path\*.txt"') DO attrib +r "%%a:%%b"
FOR /R "C:\Folder\Path\" %%D IN (.) DO (
    FOR /F "DELIMS=: TOKENS=1,2" %%a IN ('findstr C:"// _READONLY_" "%%~fdD\*.txt"') DO (
        attrib +r "%%~a:%%~b"))

支持资源

  • 为/F

  • 支持/R

  • FOR /?

    FOR /F ["options"] %variable IN (`command`) DO command [command-parameters]
    
    
        delims=xxx      - specifies a delimiter set.  This replaces the
                          default delimiter set of space and tab.
        tokens=x,y,m-n  - specifies which tokens from each line are to
                          be passed to the for body for each iteration.
                          This will cause additional variable names to
                          be allocated.  The m-n form is a range,
                          specifying the mth through the nth tokens.  If
                          the last character in the tokens= string is an
                          asterisk, then an additional variable is
                          allocated and receives the remaining text on
                          the line after the last token parsed.
    
    In addition, substitution of FOR variable references has been
    enhanced. You can now use the following optional syntax:
    
    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~dI        - expands %I to a drive letter only
    
  • Findstr /?

    /C:string  Uses specified string as a literal search string
    

相关内容