如何将Windows NTFS中存在但大小写混乱的路径格式化为真实路径?

问题描述 投票:0回答:1

我正在做一个跨平台的项目,想通过PowerShell处理一些可以支持多平台的路径。

比如我需要从Windows的NTFS传输一串路径到Linux,通过挂载NTFS从Linux访问该路径,并处理该路径用于其他正常用途。

程序可以如下:

  • 给定一个路径字符串,表示来自源的 Windows NTFS 中的现有项目
  • 将此路径的字符串传输到Linux
  • 挂载NTFS并处理路径。

问题是:

  1. 该路径可能来自不受信任的来源,并且大小写混乱,例如,可能是精心设计的,
    c:\uSeRs\usER\TesT.tXt
    ,即使它代表真实的路径
    C:\Users\User\test.txt
  2. 如果我不经过任何流程就将大小写混淆的转移到Linux上,会带来一些潜在的风险:
    • 在 Linux 方面,我无法通过字面区分
      c:\uSeRs\usER\TesT.tXt
      C:\Users\User\test.txt
      ,因为它们都代表相同的资源。
    • 同样在Linux端,我必须执行一些额外的操作来确定以上2条路径是否相同:
      • 使用其自己的机制访问已安装的 NTFS
      • 模仿 NTFS 的正常行为
      • ...
  3. Linux端对传输的路径进行任何额外的操作似乎非常没有必要。为什么我无法将规范化(格式化)路径从 Windows 传输到 Linux?
  4. 虽然我们通常以不区分大小写的方式使用 NTFS,但实际上 它具有区分大小写的能力。
  5. 并且,由于我们可以通过
    Explorer.exe
    看到路径的真实情况,这意味着原始区分大小写的路径的信息只是记录在某处。从区分大小写的路径中,我们可以定位到特定的项目,但是如何获取包含其区分大小写的路径的原始信息?

可能点数太多。但我的关键问题可以描述为以下目标:

  • 在 Windows 上使用 PowerShell 7.0+
  • 已经有一个文件
    C:\Users\User\test.txt
  • 仅给予
    c:\uSeRs\usER\TesT.tXt
  • 获取字符串
    C:\Users\User\test.txt
    ,我们可以从
    explorer.exe
  • 看到

我已经尝试过

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  
# 'c' has been converted to `C` but the other parts have not been converted to the target

(Get-Item $known).FullName -eq $target
# False

# see https://stackoverflow.com/a/48845935/17357963
(Get-Item $known).Target 
# return $null or empty

(Get-ItemProperty $known).FullName -eq $target
# False

(Get-ItemProperty $known).Target 
# return $null or empty

提前致谢。

windows powershell case-sensitive ntfs
1个回答
0
投票

根据评论,我们得出的答案是:

Get-ChildItem (Split-Path $known) | Where-Object Name -eq (Split-Path $known -leaf)).FullName
© www.soinside.com 2019 - 2024. All rights reserved.