AlphaFS преодолевает ограничение пути в 260 символов

#excel #powershell #dll

#excel #powershell #dll

Вопрос:

Get-ChildItem : указанный путь, имя файла или оба слишком длинные. Полное имя файла должно быть не более 260 символов, а имя каталога должно быть не более 248 символов.

Мне все еще нужно работать с этими объектами, и переименование для сокращения имен не является вариантом, так есть ли вообще возможность работать с объектами, путь к которым слишком длинный для Get-ChildItem?

Затем я узнал об открытом исходном коде .СЕТЕВАЯ библиотека под названием AlphaFS, которая преодолевает эти ограничения. Как я могу заменить свой скрипт на AlphaFS?

 [Reflection.Assembly]::LoadFrom("C:DRIVERSNPOI 2.2.1 binary packageReleaseNet40NPOI.dll")
[Reflection.Assembly]::LoadFrom("C:DRIVERSNPOI 2.2.1 binary packageReleaseNet40NPOI.OOXML.dll")
[Reflection.Assembly]::LoadFrom("C:DRIVERSNPOI 2.2.1 binary packageReleaseNet40NPOI.OpenXml4Net.dll")
[Reflection.Assembly]::LoadFrom("C:DRIVERSNPOI 2.2.1 binary packageReleaseNet40NPOI.OpenXml4Net.dll")
[Reflection.Assembly]::LoadFrom("C:DRIVERSNPOI 2.2.1 binary packageReleaseNet40NPOI.OpenXmlFormats.dll")
[Reflection.Assembly]::LoadFrom("C:DRIVERSNPOI 2.2.1 binary packageReleaseNet40ICSharpCode.SharpZipLib.dll")

$wb = New-Object NPOI.XSSF.UserModel.XSSFWorkbook;
$ws = $wb.CreateSheet("Company_NTFS_Permissions");
$wr = $ws.CreateRow(0);



$wr.createCell(0).setCellValue("Folder Path");
$wr.createCell(1).setCellValue("Users/Groups");
$wr.createCell(2).setCellValue("Permissions");
$wr.createCell(3).setCellValue("AccessControlType");
$wr.createCell(4).setCellValue("Permissions Inherited")



$dirToAudit = Get-ChildItem -Path "C:Inetpub" -recurse | Where { $_.psIsContainer -eq $true }

$maxRow = 1048576
$intRow = 1
$intNextSheet = 2

foreach ($dir in $dirToAudit)
{
    $colACL = Get-Acl -Path $dir.FullName

    foreach ($acl in $colACL)
    {
        $fileNameRow = $ws.CreateRow($intRow)
        $fileNameRow.CreateCell(0).SetCellValue($dir.FullName)
        $intRow  

        if ($intRow -eq $maxRow)
        {
            $ws = $wb.CreateSheet("Company_NTFS_Permissions"   $intNextSheet);
            $intNextSheet  
            $intRow = 0
        }

        foreach ($accessRight in $acl.Access)
        {
            $values = $ws.CreateRow($intRow)
            $values.CreateCell(1).SetCellValue($($AccessRight.IdentityReference).ToString())
            $values.CreateCell(2).SetCellValue($($AccessRight.FileSystemRights).ToString())
            $values.CreateCell(3).SetCellValue($($AccessRight.AccessControlType).ToString())
            $values.CreateCell(4).SetCellValue($($acl.AreAccessRulesProtected).ToString())
            $intRow  

            if ($intRow -eq $maxRow)
            {
                $ws = $wb.CreateSheet("Company_NTFS_Permissions"   $intNextSheet);
                $intNextSheet  
                $intRow = 0
            }
        }
    }

}
$fs = new-object System.IO.FileStream("C:exporttest.xlsx",[System.IO.FileMode]'Create',[System.IO.FileAccess]'Write')
$wb.Write($fs);
$fs.Close()
 

Комментарии:

1. Вы пробовали subst отображать длинные пути в качестве виртуальных дисков?

2. Нет, я никогда раньше не пробовал ничего подобного

3. В этом случае mklink кажется более подходящим subst . У вас закончатся диски, используя subst 🙂

4. спасибо, как мне использовать функцию Get-LongPathName вместо Get-Childitem ? Не могли бы вы привести пример, как его использовать?

5. Загрузите скрипт, поместите его в папку, которая вам нравится, и укажите источник в вашем реальном скрипте (. <path_to_scriptGet-LongPathName.ps1)