路径不存在时,如何将8.3短路径转换为完整路径?
8.3短路径转长路径(路径不存在时的处理)
常规的Get-Item方法仅能在目标文件/目录存在时将8.3短路径转换为完整长路径,当路径不存在时会抛出“目标不存在”的错误:
有效代码(路径存在时):
$TargetPath = "存在的文件或文件夹的8.3短路径" (Get-Item -LiteralPath $TargetPath).FullName报错代码(路径不存在时):
$TargetPath = "不存在的文件或文件夹的8.3短路径" (Get-Item -LiteralPath $TargetPath).FullName
核心限制
8.3短路径与长路径的映射关系存储在NTFS文件系统的元数据中,仅当文件/目录实际存在时,系统才会保留对应的映射记录。如果目标路径不存在,系统没有相关数据,无法直接获取准确的原始长路径。
折中处理方案
可以通过拆分路径,逐段转换存在的父目录部分,不存在的部分保留短名称(或尝试基于常见命名推测,但推测结果不保证准确)。以下是PowerShell实现示例:
function Convert-ShortPath { param([string]$ShortPath) $currentPath = '' # 拆分路径段 $segments = $ShortPath -split '\\' foreach ($seg in $segments) { if (-not $seg) { continue } $testPath = Join-Path $currentPath $seg try { # 尝试获取当前段的长路径(仅当路径存在时有效) $item = Get-Item -LiteralPath $testPath -ErrorAction Stop $currentPath = $item.FullName } catch { # 路径不存在时,保留短名称继续拼接 $currentPath = Join-Path $currentPath $seg } } return $currentPath } # 示例调用:转换包含不存在项的短路径 Convert-ShortPath "C:\PROGRA~1\UNINST~1\MISSIN~1.EXE"
该方法仅能将存在的父目录部分转换为长路径,不存在的文件/子目录段仍会保留短名称,无法还原出原本的长路径(因为系统无记录)。
内容的提问来源于stack exchange,提问作者Tanaka Saito
相关产品推荐
相关产品推荐

