【问题标题】:How do I check if all the files in a folder is read only recursively?如何检查文件夹中的所有文件是否递归只读?
【发布时间】:2016-06-28 10:26:10
【问题描述】:

目前我正在获取只读文件的总文件数和文件数,看看它们是否相同:

function AllReadOnly{
    param([string]$Path)
    $file_count = Get-ChildItem $Path -Recurse -File | Measure-Object | %{$_.Count}
    $read_file_count = Get-ChildItem $Path -Recurse -File -Attributes ReadOnly | Measure-Object | %{$_.Count}
    $read_file_count
    $file_count
}

即使这是正确的,也需要很长时间,我不禁觉得应该有更好的方法来做到这一点。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    目前你在所有文件上循环两次,所以如果你在同一个循环中增加两个变量,然后返回一个布尔值来指示计数是否不同,这已经是一个改进:

    function AllReadOnly {
        Param([string]$Path)
    
        $all = 0
        $ro  = 0
        Get-ChildItem $Path -Recurse -File | ForEach-Object {
          $all++
          if ($_.Attributes.value__ -band 1) { $ro++ }
        }
    
        $all -eq $ro
    }
    

    但是,由于您想检查 所有 文件是否为只读文件,因此只要遇到第一个可写文件就返回 $false 就足够了:

    function AllReadOnly {
        Param([string]$Path)
    
        Get-ChildItem $Path -Recurse -File | ForEach-Object {
          if (-not ($_.Attributes.value__ -band 1)) {
            $false
            continue
          }
        }
    
        $true
    }
    

    编辑:

    $_.Attributes.value__ 是文件属性的数值。二进制值 1 表示设置了只读标志,因此如果属性值和 1 的按位/逻辑与返回值 != 0 则设置标志,否则不设置。这是因为逻辑 AND 仅在两个操作数都为 true/1 和 false/0 时才返回 true/1。

    例子:

    101001 和 000001 ------ 000001 ← 标志设置 101000 和 000001 ------ 000000 ← 标志未设置

    有关布尔代数的更多信息,请参阅Wikipedia

    【讨论】:

    • 非常感谢,我现在已将此标记为答案!您能否详细说明 -not ($_.Attributes.value__ -band 1) 部分?这个语法和那些关键字我不熟悉!
    • 并且不会继续检查下一次迭代?它不应该中断,因为如果我发现一个不是只读的文件,循环应该结束吗?或者甚至返回?
    • here。不过return 并没有像我预期的那样工作,所以我求助于$false; continue
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2011-02-12
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多