我有一个文件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 函数基于另一个开发人员在https://stackoverflow.com/a/11436327/854680上针对 C# 的优雅解决方案。
因为没有使用Get-ChildItem ,所以速度要快很多,这在调用这个函数几十次或几百次时就不同了。
无需指定确切名称,只需使用通配符即可:
这应该返回
README.TXT
PowerShell 中的大部分文件系统工作是由 System.IO 命名空间中的一些 .NET 类完成的。如果您知道路径(就像在您的示例中,您已经导航到主题文件所在的文件系统位置),那么您可以使用类似
由于 .NET 基类区分大小写,因此文件名的结果输出也将区分大小写。
作为参考,在示例中,您正在调用表示当前工作目录 ($pwd) 的 System.IO.DirectoryInfo 对象的 GetFiles 方法。您可以将其更改为指向包含您需要确认大小写的文件的目录。
Name、BaseName 和 FullName 属性都应反映正确的大小写。
有关 GetFiles 方法的更多信息。
我能想到的最快方法是用 *\ 替换所有斜杠,然后调用 Get-Item,并确保您没有被骗,选择与您指定的不区分大小写的斜杠相同的斜杠。
这是我快速而肮脏(无验证)的方法:
我将分两部分提供答案。1) 如果您只关心文件名的大小写和 2) 如果您关心完整文件路径的大小写。
1.文件名大小写
让 Powershell 为您提供文件名的正确大小写的最简单方法是让它搜索文件名。我们可以通过为文件名的第一个字母使用 RegEx 字符类(有效字符集)来实现这一点。
对于 ReadMe.txt 我们可以通过 [R]eadMe.txt 进行搜索。RegEx 字符类旨在通常用于多个可能的字符,但在这种情况下,我们只使用一个来始终获得单个匹配项:
以上返回大小写正确的文件名:
如果文件名是动态提供或查找的,您可以使用以下简单的 RegEx 语句将第一个字符括在方括号中:
这将返回:
获取大小写正确的文件名的示例用法:
以上返回大小写正确的文件名:
2.完整文件路径案例
这里的基本概念与第一部分相同。我们将让 Powershell 通过搜索每个段来为我们提供完整文件路径的所有段的正确大小写。
与我们之前的方法类似,最简单的方法是用括号将每个段的第一个字符括起来。
如果文件名已知,例如:
您可以通过为每个段的第一个字母引入 RegEx 字符类(有效字符集)来获得完整路径的正确大小写:
在我的系统上,这会返回大小写正确的完整路径和文件名:
如果正在动态传递或查找完整文件路径,您可以简单地使用以下 RegEx 语句自动用括号括起每个段的第一个字符:
这将返回:
使用正确大小写获取完整文件路径的示例用法:
以上返回具有正确大小写的完整文件路径: