You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell日志函数无法写入数据问题排查求助

PowerShell NTFS/ACL日志函数问题修正

问题根源

你的代码主要有3个核心问题:

  • 日志函数没接收参数,直接依赖全局的$Folder和$ACL,而且创建的$logObj没添加到$logData数组里,导致数组一直为空,日志自然没内容。
  • 要是把日志写入逻辑塞到函数里,每次调用函数都会执行Format-Table并追加,每次都会输出表头,就会重复。
  • 代码存在语法错误:CreateLog函数没闭合,循环的括号也不配对。

修正方案

  1. 给日志函数加参数,明确传入$Folder和$ACL,让函数返回日志对象,再统一收集到数组中。
  2. 所有循环结束后一次性写入日志,避免重复表头;如果要实时写入,先单独写一次表头,之后只追加数据行。
  3. 修正语法,保证函数和循环结构完整。

修正后的完整代码

# 变量定义
$rootDir = "\\server1\share1"
$logDir = "c:\temp"
$date = (Get-Date -Format "MMddyyyy-HHmm")
$logData = @()

# 日志函数:接收Folder和ACL作为参数,返回日志对象
Function CreateLog {
    param(
        [Parameter(Mandatory=$true)]
        [System.IO.DirectoryInfo]$Folder,
        [Parameter(Mandatory=$true)]
        [System.Security.AccessControl.FileSystemAccessRule]$ACL
    )

    # 创建日志对象,用PSCustomObject更简洁
    return [PSCustomObject]@{
        FolderPath = $Folder.FullName
        IdentityReference = $ACL.IdentityReference.ToString()
        # 原代码$Folder[0]逻辑错误,改为取文件夹名称
        folder = $Folder.Name
        FileSystemRights = $ACL.FileSystemRights.ToString()
        InheritanceFlags = $ACL.InheritanceFlags.ToString()
    }
}

# 获取所有子文件夹
$Folders = Get-ChildItem -Path $rootDir -Directory -Recurse

foreach ($Folder in $Folders){
    $ACLs = Get-Acl $Folder.FullName | Select-Object -ExpandProperty Access
    Foreach ($ACL in $ACLs){
        # 调用函数并传入参数,将返回的对象添加到日志数组
        $logData += CreateLog -Folder $Folder -ACL $ACL
        
        if($ACL.FileSystemRights -eq "FullControl"){ 
            Write-Host "处理文件夹:$($Folder.FullName),权限为完全控制"
        }
    }
}

# 一次性写入日志,确保表头只出现一次
if ($logData.Count -gt 0) {
    $logData | Select-Object folder, IdentityReference, FileSystemRights, InheritanceFlags, FolderPath | 
        Format-Table -Wrap | 
        Out-File "$logDir\testlog-$date.log" -Encoding utf8
} else {
    Write-Host "未收集到任何ACL数据"
}

关键改动说明

  • 给CreateLog函数添加强制参数,避免依赖全局变量,代码更稳定可靠。
  • 用[PSCustomObject]替代New-Object,语法更简洁,PowerShell 3.0及以上版本都支持。
  • 修正原代码中$Folder[0]的错误逻辑,改为获取文件夹名称。
  • 先把所有日志对象收集到数组,最后统一写入,确保表头只输出一次。
  • 添加空数据判断,避免生成空日志文件,同时给出明确提示。

内容的提问来源于stack exchange,提问作者RookieMistake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:56