PowerShell日志函数无法写入数据问题排查求助
PowerShell NTFS/ACL日志函数问题修正
问题根源
你的代码主要有3个核心问题:
- 日志函数没接收参数,直接依赖全局的
$Folder和$ACL,而且创建的$logObj没添加到$logData数组里,导致数组一直为空,日志自然没内容。 - 要是把日志写入逻辑塞到函数里,每次调用函数都会执行
Format-Table并追加,每次都会输出表头,就会重复。 - 代码存在语法错误:
CreateLog函数没闭合,循环的括号也不配对。
修正方案
- 给日志函数加参数,明确传入
$Folder和$ACL,让函数返回日志对象,再统一收集到数组中。 - 所有循环结束后一次性写入日志,避免重复表头;如果要实时写入,先单独写一次表头,之后只追加数据行。
- 修正语法,保证函数和循环结构完整。
修正后的完整代码
# 变量定义 $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
相关产品推荐
相关产品推荐

