AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 431416
Accepted
Roger Lipscombe
Roger Lipscombe
Asked: 2012-09-25 08:00:14 +0800 CST2012-09-25 08:00:14 +0800 CST 2012-09-25 08:00:14 +0800 CST

在存储在磁盘上的情况下获取文件名?

  • 772

我有一个文件README.TXT。如果我发出以下命令:

PS> Get-Item ReadMe.txt

...然后它返回“ReadMe.txt”。我想找出磁盘上文件的实际名称,包括大小写。如何让它返回“README.TXT”?

我问是因为我试图找出 Windows 上不区分大小写的文件名与 Unix 机器上区分大小写的文件的问题,我想获得 Windows 机器上使用的实际大小写。

更多详细信息:我有一个文件列表(存储在一个.CSPROJ文件中),这些文件与存储在磁盘上的文件不同。我想确保它们匹配。例如:如果.CSPROJ文件是“ReadMe.txt”,但磁盘上的文件是“README.TXT”,有时在 Visual Studio 中编辑文件会将文件重写为“ReadMe.txt”,这会使 Perforce 感到困惑,因为它是大小写-sensitive,并且文件名不再具有预期的大小写。我想写一个脚本来发现不匹配的文件名,这样我就可以在它引起问题之前对它们做一些事情。

powershell
  • 7 7 个回答
  • 1886 Views

7 个回答

  • Voted
  1. Best Answer
    Roger Lipscombe
    2012-09-26T00:33:41+08:002012-09-26T00:33:41+08:00

    这是我想出的:

    function Get-ActualFileName($file) {
        $parent = Split-Path $file
        $leaf = Split-Path -Leaf $file
    
        $result = Get-ChildItem $parent | where { $_ -like $leaf }
        $result.Name
    }
    
    • 5
  2. MikeOnline
    2019-04-25T08:53:51+08:002019-04-25T08:53:51+08:00

    以下 PowerShell 函数基于另一个开发人员在https://stackoverflow.com/a/11436327/854680上针对 C# 的优雅解决方案。

    因为没有使用Get-ChildItem ,所以速度要快很多,这在调用这个函数几十次或几百次时就不同了。

    function Get-FileNameTrueCase {
        Param (
            [parameter(Mandatory=$true)]
            [string]
            $DirOrFile
        )
    
        if (-not ( (Test-Path $DirOrFile -PathType Leaf) -or (Test-Path $DirOrFile -PathType Container) ) ) {
            # File or directory not found
            return $DirOrFile
        }
    
        $TruePath = "";
        foreach ($PathPart in $DirOrFile.Split("\")) {
            if ($TruePath -eq "") {
                $TruePath = $PathPart.ToUpper() + "\";
                continue;
            }
            $TruePath = [System.IO.Directory]::GetFileSystemEntries($TruePath, $PathPart)[0];
        }
        return $TruePath;
    }
    
    • 3
  3. Peter Hahndorf
    2013-09-29T02:38:22+08:002013-09-29T02:38:22+08:00

    无需指定确切名称,只需使用通配符即可:

    PS> Get-Item ReadMe.tx?
    

    这应该返回README.TXT

    • 2
  4. Steven Murawski
    2012-09-25T08:50:33+08:002012-09-25T08:50:33+08:00

    PowerShell 中的大部分文件系统工作是由 System.IO 命名空间中的一些 .NET 类完成的。如果您知道路径(就像在您的示例中,您已经导航到主题文件所在的文件系统位置),那么您可以使用类似

    (get-item $pwd).GetFiles('readme.txt')
    

    由于 .NET 基类区分大小写,因此文件名的结果输出也将区分大小写。

    作为参考,在示例中,您正在调用表示当前工作目录 ($pwd) 的 System.IO.DirectoryInfo 对象的 GetFiles 方法。您可以将其更改为指向包含您需要确认大小写的文件的目录。

    Name、BaseName 和 FullName 属性都应反映正确的大小写。

    有关 GetFiles 方法的更多信息。

    • 1
  5. Jaykul
    2013-09-28T20:39:07+08:002013-09-28T20:39:07+08:00

    我能想到的最快方法是用 *\ 替换所有斜杠,然后调用 Get-Item,并确保您没有被骗,选择与您指定的不区分大小写的斜杠相同的斜杠。

    $Path = Get-Item "$($Path.TrimEnd('\/') -replace "(?<!:)(\\|/)", '*$1')*" |
               Where { $_.FullName -ieq $Path } | Convert-Path
    
    • 0
  6. Hassan
    2015-11-04T18:07:27+08:002015-11-04T18:07:27+08:00

    这是我快速而肮脏(无验证)的方法:

    Function Resolve-PathName { [CmdletBinding()]
    Param(
        [Parameter(ValueFromPipelinebyPropertyName,ValueFromPipeline,Mandatory)]
        [Alias("Fullname")]
        [string] $File,
        [switch] $Cygpath
    ) Process {
        $cur = $File
        $stack = New-Object System.Collections.Stack
    
        while ( $cur.length -gt 0) {
            $stack.Push( (split-path $cur -Leaf) )
            $cur = split-path $cur
        }
        $cur = get-item ($stack.pop())
        while ( $stack.Count -gt 0) {
            $cur = $cur | Get-ChildItem -Filter ($stack.Pop())
        }
        if ($Cygpath) {
            cygpath $cur.Fullname
        } else {
            $cur.Fullname
        }
    }}
    
    • 0
  7. Tolga
    2021-04-04T19:24:43+08:002021-04-04T19:24:43+08:00

    我将分两部分提供答案。1) 如果您只关心文件名的大小写和 2) 如果您关心完整文件路径的大小写。

    1.文件名大小写

    让 Powershell 为您提供文件名的正确大小写的最简单方法是让它搜索文件名。我们可以通过为文件名的第一个字母使用 RegEx 字符类(有效字符集)来实现这一点。

    对于 ReadMe.txt 我们可以通过 [R]eadMe.txt 进行搜索。RegEx 字符类旨在通常用于多个可能的字符,但在这种情况下,我们只使用一个来始终获得单个匹配项:

    Get-Item [R]eadMe.txt | Select Name
    

    以上返回大小写正确的文件名:

    自述文件

    如果文件名是动态提供或查找的,您可以使用以下简单的 RegEx 语句将第一个字符括在方括号中:

    "ReadMe.txt" -replace "^(.)", '[$1]'
    

    这将返回:

    [R]自述文件.txt

    获取大小写正确的文件名的示例用法:

    $filename = "ReadMe.txt"
    Get-Item ($filename -replace "^(.)", '[$1]') | Select Name
    

    以上返回大小写正确的文件名:

    自述文件

    2.完整文件路径案例

    这里的基本概念与第一部分相同。我们将让 Powershell 通过搜索每个段来为我们提供完整文件路径的所有段的正确大小写。

    与我们之前的方法类似,最简单的方法是用括号将每个段的第一个字符括起来。

    如果文件名已知,例如:

    c:\WINDOWS\systeM32\driverS\ETC\hosTS
    

    您可以通过为每个段的第一个字母引入 RegEx 字符类(有效字符集)来获得完整路径的正确大小写:

    Get-Item c:\[W]INDOWS\[s]ysteM32\[d]riverS\[E]TC\[h]osTS | Select FullName
    

    在我的系统上,这会返回大小写正确的完整路径和文件名:

    C:\Windows\System32\drivers\etc\hosts

    如果正在动态传递或查找完整文件路径,您可以简单地使用以下 RegEx 语句自动用括号括起每个段的第一个字符:

    $FullFilePath = "c:\WINDOWS\systeM32\driverS\ETC\hosts"
    $FullFilePath -replace "(\\|/)(.)", '$1[$2]'
    

    这将返回:

    c:\[W]INDOWS\[s]ysteM32\[d]riverS\[E]TC\[h]osts
    

    使用正确大小写获取完整文件路径的示例用法:

    $FullFilePath = "c:\WINDOWS\systeM32\driverS\ETC\hosts"
    Get-Item ($FullFilePath -replace "(\\|/)(.)", '$1[$2]') | Select FullName
    

    以上返回具有正确大小写的完整文件路径:

    C:\Windows\System32\drivers\etc\hosts

    • 0

相关问题

  • 资源锁和电源外壳

  • 脚本 - 如何断开远程桌面会话?

  • 如何限制向通讯组发送到外部地址?

  • Powershell对值与数组的作用不同?

  • Windows Powershell Vim 键绑定

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve