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

我有一个文件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,因为它是区分大小写的,文件名不再有它期望的情况。 我想编写一个脚本来查找不匹配的文件名,以便在导致问题之前对其进行处理。

以下是我想到的:

 function Get-ActualFileName($file) { $parent = Split-Path $file $leaf = Split-Path -Leaf $file $result = Get-ChildItem $parent | where { $_ -like $leaf } $result.Name } 

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

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

由于.NET基类是区分大小写的,所以文件名的输出结果也是区分大小写的。

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

Name,BaseName和FullName属性都应该反映正确的框。

有关GetFiles方法的更多信息。

我能想到的最快的方法是用*replace所有的斜杠,然后调用Get-Item,并确保你没有任何愚蠢,select一个不区分大小写的指定。

 $Path = Get-Item "$($Path.TrimEnd('\/') -replace "(?<!:)(\\|/)", '*$1')*" | Where { $_.FullName -ieq $Path } | Convert-Path 

而不是指定确切的名称,只需使用通配符:

 PS> Get-Item ReadMe.tx? 

这应该返回README.TXT

这是我的快速和肮脏的(不validation)方法:

 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 } }}