如何检查文件夹中的所有文件是否只是递归读取?

时间:2016-06-28 10:26:10

标签: powershell

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

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
}

即使这是正确的,也需要很长时间,我无法提供帮助,但我觉得应该有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:2)

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

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的按位/逻辑AND返回值!= 0,则设置标志,否则不设置。这是因为只有当两个操作数都为真/ 1时才会返回true / 1,否则返回false / 0。

示例:

    101001
AND 000001
    ------
    000001 ← flag set

    101000
AND 000001
    ------
    000000 ← flag not set

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