目前,我正在获取只读文件的总文件数和文件数,看看它们是否相同:
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
}
即使这是正确的,也需要很长时间,我无法提供帮助,但我觉得应该有更好的方法来做到这一点。
答案 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。