Проблема исключения длины файла в Powershell - PullRequest
0 голосов
/ 20 сентября 2018

Я пытался запустить этот скрипт, который захватывает все файлы / папки в каталоге общего ресурса и передает его обратно в spunk.Однако скрипт дает исключение PathTooLongException, хотя самый длинный путь, который я могу найти, состоит из 197 символов.

Я попытался сопоставить общий ресурс как папку с именем z в корне диска C, что совсем не помогает.Может кто-нибудь пролить свет на то, как обойти это или что вызывает ошибки?

param (
[string]$directory = "C:\Windows\Logs"
 )
 $errorCount = 0
$OutputList = @()
$directoryLink = 'c:\z'

#set up symbolic link
cmd /c mklink /d $directoryLink $directory

 try
{
$colItems = (Get-ChildItem -Path $directoryLink -Recurse | Sort-Object) 
}
catch
{
$errorCount += 1   
}
foreach ($i in $colItems) 
{
try
{        
    $subFolderItems = (Get-Item $i.FullName | Measure-Object -property 
    length -sum -ErrorAction SilentlyContinue) 
    $acl=$i.GetAccessControl()
    $SizeValue= [Math]::Round(($subFolderItems.sum / 1MB),3)

    $SplunkFileList = New-Object PSObject  
    $SplunkFileList | Add-Member -type NoteProperty -name Filename -Value $i.FullName
    $SplunkFileList | Add-Member -type NoteProperty -name SizeMb -Value $SizeValue
    $SplunkFileList | Add-Member -type NoteProperty -name LastAccess -Value $i.LastAccessTime
    $SplunkFileList | Add-Member -type NoteProperty -name Owner -Value $acl.Owner

    if ($i.PSIsContainer)
    {
        $SplunkFileList | Add-Member -type NoteProperty -name Type -Value "D"
    }
    else
    {
        $SplunkFileList | Add-Member -type NoteProperty -name Type -Value "F"
    }

    $OutputList += $SplunkFileList  

} 
catch [System.IO.IOExeception]
{
    Write-Host 'An Exception was caught.'
    Write-Host "Exception : $($_.Exception.GetType().FullName)"
    $errorCount += 1
    }   
} 
$OutputList | Select-Object Filename,SizeMb,LastAccess,Owner,Type | Format-
List

1 Ответ

0 голосов
/ 20 сентября 2018

Если вы используете современную версию Powershell (v5.1 +, я думаю), вы можете найти пути длиной более 260 символов, используя Unicode-версию Windows API.

Чтобы сделать это, вы начинаете путь с \\?\, например:

Get-ChildItem -LiteralPath '\\?\C:\Windows\Logs' -Recurse

Примечание: LiteralPath вместо Path


Если вы хотитедля использования UNC-пути (\\server\C$\folder) синтаксис немного отличается:

Get-ChildItem -LiteralPath '\\?\UNC\server\C$\folder' -Recurse 
...