You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:22:48