You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PowerShell脚本导出Windows目录权限至CSV:将权限分隔符从逗号改短横

解决PowerShell导出CSV时权限字段被拆分的问题

这个问题我太熟悉了!CSV解析器会把逗号当成列分隔符,所以你的FileSystemRights里的逗号直接写进去肯定会拆成多列。给你两个实用的解决思路:

方法一:用PowerShell内置的Export-Csv(推荐)

这是最省心的方案,PowerShell的Export-Csv会自动处理所有CSV格式问题,比如给带特殊字符的字段套双引号,完全不用你手动拼接字符串。

步骤如下:

  1. 先把权限数据整理成对象数组,同时把FileSystemRights转换成你想要的连字符分隔格式
  2. 直接用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

火山引擎 最新活动