【问题标题】:Don't cut off foldername in genericList不要切断 genericList 中的文件夹名称
【发布时间】:2019-05-22 13:01:29
【问题描述】:

我有一些代码将特定用户对包含所有子文件夹的文件夹的权限写入通用列表。稍后在代码中,我将打印此列表。但是,如果目录太大(4+ 文件夹,名称会被截断。我需要写下整个目录名称,而不仅仅是缩短版本。有什么我可以使用的参数吗?

Import-Module ActiveDirectory

$User = "Testumgebung\cbruehwiler"
$UserOhneDomain = $User -creplace '^[^\\]*\\', ''
$Path = "\\ESX-SHARE\File Transfer"

$List = New-Object System.Collections.Generic.List[System.Object]
$Groups = Get-ADPrincipalGroupMembership $UserOhneDomain 
$From = $User

$GroupArrayList = New-Object System.Collections.ArrayList
foreach ($Group in $Groups)
{
$GroupArrayList.Add($Group.Name) | Out-Null 
} 

$OutputFields = @(
    @{name="Item" ;       expression={$_.Path.split(':',3)[-1]}}
    @{name="Rights" ;     expression={$Right.FileSystemRights}}
    @{name="AccessType" ; expression={$Right.AccessControlType}}
    @{name="From" ;       expression={$From}}
) 

$FileSystemObjects = Get-ChildItem $Path -Recurse | ?{ $_.PSIsContainer } | ForEach-Object {Get-Acl $_.FullName}

foreach ($Item in $FileSystemObjects) {
    foreach ($Right in $Item.Access) {
        if ($Right.IdentityReference -eq $User -And ($Right.IsInherited -eq $false))
        {
            $From = $User
            $List.Add(($Item | Select-Object $OutputFields))
        }
        foreach ($GroupArrayItem in $GroupArrayList){
            if ($Right.IdentityReference -eq ("TESTUMGEBUNG\" + $GroupArrayItem) -And ($Right.IsInherited -eq $false)) 
            {
                $From = $GroupArrayItem
                $List.Add(($Item | Select-Object $OutputFields))
            }
        }
    }   
}

$List | Out-File C:\Users\cbruehwiler\Desktop\PermissionCheck.csv
$DateTime = Get-Date
$DateTime >> C:\Users\cbruehwiler\Desktop\PermissionCheck.csv

这就是结果的样子。

Item                                                                   Rights                                    AccessType From             

----                                                                   ------                                    ---------- ----                                          
\\ESX-SHARE\File Transfer\TestFolder\Sub_Te...                         FullControl                                    Allow Testumgebung\cbruehwiler                      

不过我想要这样

\\ESX-SHARE\File Transfer\TestFolder\Sub_TestFolder\Sub_Sub_TestFolder

提前谢谢你

【问题讨论】:

  • 您的某些代码似乎丢失了...
  • 应该没那么重要。我猜这是语法问题,或者可能是 powershell 的问题。
  • 这非常重要 - 如果这是您在控制台中呈现对象时看到的内容,这是意料之中的 - 字符串不会“截断”,但 PowerShell 中的格式化子系统会截断它们以使屏幕上的房间。如果您将数据导出到文本文件或 csv,您可能会发现您的字符串完好无损
  • 再说一次,如何你这样做可能很重要,所以请用你运行的确切步骤和命令更新你的帖子,以获得你描述的结果
  • 好的,谢谢。不知道。

标签: active-directory powershell-2.0 acl generic-list


【解决方案1】:

您正在输出到带有Out-File 的CSV 文件。这是不正确的;你需要Export-Csv。如果您需要合法的 CSV 文档,您也需要在最后一行中删除日期输出。 (您可以稍后运行Get-Item MyFile.csv | Format-Table Name, CreationTime 来获取该信息;文件系统会免费为您提供一些日期信息。)

这本身就代表了一个完整的解决方案。您的输出不会被截断。但如果可以的话,我想解释一下区别。

Powershell 有一些默认操作会挂在您的代码 sn-p 中。 Out-File 接受字符串内容,但您正在传递对象,因此 PS 将使用其默认格式化程序。当管道中的第一项具有 4 个或更少的可见属性时,将是 Format-Table,否则为 Format-List

Format-Table 有一个-Wrap 开关,它会导致溢出的内容换行而不是截断。有时,使用-AutoSize 也足以调整列宽,但这只会在问题是截断时让你到目前为止。 Format-List 将始终换行。

如果您只想要一个属性并且您可以承受丢失列标题,请尝试通过管道连接到Select-Object -ExpandProperty Item

我希望现在很清楚,这些格式化命令正在将结构化数据扁平化为文本,尽管是格式化的文本。这将始终使您失去保真度,并使您更难以对数据进行任何进一步的操作。如果您改用Export-Csv,您可以稍后运行Import-Csv 以获取数据作为结构化输出。另外,您可以在Excel等中打开。

一句警告:Export-Csv 不能很好地处理引号。如果这成为问题,请尝试Export-CliXml,它使用特定于 PS 的 XML 方言,并提供您可以获得的最高保真度(除非您愿意投入大量工作!)该命令是Import-CliXml

Export-Csv 的最后一个提示:通常您不想要标头信息,因此将其与 -NoTypeInformation 开关一起使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多