PowerShell脚本导出Windows目录权限至CSV:将权限分隔符从逗号改短横
解决PowerShell导出CSV时权限字段被拆分的问题
这个问题我太熟悉了!CSV解析器会把逗号当成列分隔符,所以你的FileSystemRights里的逗号直接写进去肯定会拆成多列。给你两个实用的解决思路:
方法一:用PowerShell内置的Export-Csv(推荐)
这是最省心的方案,PowerShell的Export-Csv会自动处理所有CSV格式问题,比如给带特殊字符的字段套双引号,完全不用你手动拼接字符串。
步骤如下:
- 先把权限数据整理成对象数组,同时把
FileSystemRights转换成你想要的连字符分隔格式 - 直接用
Export-Csv导出
示例代码:
# 假设$directories是你要遍历的目录集合 $permissionRecords = foreach ($directory in $directories) { # 获取目录的ACL权限 $acl = Get-Acl -Path $directory.FullName foreach ($accessRule in $acl.Access) { # 把默认的逗号分隔权限转换成连字符格式,比如"ReadData, ExecuteFile"变成"ReadData-ExecuteFile" $formattedRights = $accessRule.FileSystemRights -replace ', ', '-' # 用自定义对象存储每条记录 [PSCustomObject]@{ DirectoryPath = $directory.FullName IdentityReference = $accessRule.IdentityReference.Value FileSystemRights = $formattedRights } } } # 导出到CSV,-NoTypeInformation去掉PowerShell的类型头,-Encoding UTF8保证中文和特殊字符显示正常 $permissionRecords | Export-Csv -Path "C:\YourOutputPath\Permissions.csv" -NoTypeInformation -Encoding UTF8
方法二:手动处理字符串格式(如果坚持用WriteLine)
如果你一定要用自己的文件流写入逻辑,那必须给包含逗号的字段套双引号,或者先把权限里的逗号替换掉。
方案A:替换权限里的逗号为连字符
直接把FileSystemRights中的, 替换成-,这样字段里就没有逗号了,CSV自然不会拆分:
$formattedRights = $access_right.FileSystemRights -replace ', ', '-' # 注意去掉逗号后面的空格,避免CSV列出现前导空格 $file_stream_output.WriteLine(('"{0}","{1}","{2}"' -f $directory.FullName, $access_right.IdentityReference, $formattedRights))
方案B:给字段套双引号
如果不想修改权限格式,就给整个FileSystemRights字段加上双引号,CSV解析器会把整个内容当成一列:
# 给权限字段套双引号,注意用反引号转义双引号 $quotedRights = "`"$($access_right.FileSystemRights)`"" $file_stream_output.WriteLine(('"{0}","{1}",{2}' -f $directory.FullName, $access_right.IdentityReference, $quotedRights))
注意:手动拼接CSV很容易踩坑,比如字段里如果出现双引号、换行符这些特殊字符,还需要额外转义,所以更推荐用第一种方法。
内容的提问来源于stack exchange,提问作者Kerbol




