Many file-related .NET Framework methods fail when the overall path length exceeds a certain length. Use low-level methods to convert lengthy paths to the old 8.3 notation which is a lot shorter in many cases:
function Get-ShortPath($Path) { $code = @' [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError=true)] public static extern uint GetShortPathName(string longPath, StringBuilder shortPath,uint bufferSize); '@ $API = Add-Type -MemberDefinition $code -Name Path -UsingNamespace System.Text -PassThru $shortBuffer = New-Object Text.StringBuilder ($Path.Length * 2) $rv = $API::GetShortPathName( $Path, $shortBuffer, $shortBuffer.Capacity ) if ($rv -ne 0) { $shortBuffer.ToString() } else { Write-Warning "Path '$path' not found." } }
Here is how you can use the new function:
PS> $null = md c:\thisIsALongName\VeryLongPath\MayExceed260chars -ea 0 PS> Get-ShortPath 'c:\thisIsALongName\VeryLongPath\MayExceed260chars' c:\THISIS~1\VERYLO~1\MAYEXC~1