如何在Windows NTFS中用PowerShell 7+修正大小写混乱的路径
解决NTFS路径大小写标准化问题(PowerShell 7+)
问题背景
开发跨平台项目时,需要将Windows NTFS路径传输到Linux(通过挂载NTFS访问)。但路径可能来自不可信源,存在大小写混乱的情况(如c:\uSeRs\usER\TesT.tXt),而NTFS实际存储的真实路径为C:\Users\User\test.txt。直接传输混乱路径到Linux会导致资源识别冲突,需在Windows端提前获取标准化的真实大小写路径。
核心目标
在PowerShell 7.0+环境中,从大小写混乱的输入路径,获取NTFS上实际存储、与Explorer显示一致的真实大小写路径。
已尝试的无效方法
使用Get-Item、Get-ItemProperty等方法无法得到真实路径,返回结果仍保留输入的大小写格式:
#Requires -Version 7.0 $target = 'C:\Users\User\test.txt' New-Item -Path $target -ItemType File $known = 'c:\uSeRs\usER\TesT.tXt' (Get-Item $known).FullName # 输出:C:\uSeRs\usER\TesT.tXt(仅盘符转为大写,其余部分未标准化) (Get-Item $known).FullName -eq $target # 输出:False
解决方案
通过递归遍历路径的每个组成部分,获取NTFS存储的真实大小写名称,拼接得到标准化路径。以下是两种可行实现:
方法1:递归遍历目录结构
function Get-RealPath { param( [Parameter(Mandatory=$true)] [string]$Path ) $item = Get-Item -Path $Path -ErrorAction SilentlyContinue if (-not $item) { return $Path } # 递归处理父目录 if ($item.PSIsContainer) { if ($item.Parent) { return [System.IO.Path]::Combine((Get-RealPath $item.Parent.FullName), $item.Name) } return $item.Name.ToUpper() # 根目录统一大写 } # 文件则处理父目录后拼接真实文件名 return [System.IO.Path]::Combine((Get-RealPath $item.Directory.FullName), $item.Name) } # 测试 $known = 'c:\uSeRs\usER\TesT.tXt' Get-RealPath -Path $known # 输出:C:\Users\User\test.txt
方法2:逐段拼接真实名称
function Get-RealPath { param( [Parameter(Mandatory=$true)] [string]$Path ) # 提取根目录(如C:\)并转为大写 $root = [System.IO.Path]::GetPathRoot($Path) if (-not (Test-Path $root)) { return $Path } $realPath = $root.ToUpper() # 拆分路径为非空的子目录/文件名 $parts = $Path.Substring($root.Length) -split '[\\/]' | Where-Object { $_ } foreach ($part in $parts) { # 查找当前目录下匹配的项(不区分大小写) $currentItem = Get-ChildItem -Path $realPath -Filter $part -Force -ErrorAction SilentlyContinue | Select-Object -First 1 if ($currentItem) { # 使用NTFS存储的真实大小写名称 $realPath = [System.IO.Path]::Combine($realPath, $currentItem.Name) } else { # 路径不存在时保留原输入部分 $realPath = [System.IO.Path]::Combine($realPath, $part) } } return $realPath } # 测试 $known = 'c:\uSeRs\usER\TesT.tXt' Get-RealPath -Path $known # 输出:C:\Users\User\test.txt
原理说明
NTFS会存储每个文件/目录的真实大小写名称,Get-ChildItem或Get-Item返回的Name属性即为该真实名称。通过递归或逐段遍历路径,用真实名称替换输入的混乱大小写部分,最终得到与Explorer显示一致的标准化路径。
内容的提问来源于stack exchange,提问作者Little Train
相关产品推荐
相关产品推荐

