Проблема исключения длины файла в Powershell
Я пытался запустить этот скрипт, который захватывает все файлы / папки в каталоге общего ресурса и передает его обратно в 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 ответ
Если вы используете современную версию 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