PowerShell – 提取文件名和扩展名

我需要从例如my.file.xlsx中提取文件名和扩展名。 我不知道文件或扩展名的名称,名称中可能有更多的点,所以我需要从右边searchstring,当我find第一个点(或从左边的最后一个),提取部分右侧和该点左侧的部分。

也许有更好的解决办法,但我没有在这里或其他地方find任何东西。 谢谢

如果文件脱离磁盘并且如其他人所述,请使用BaseNameExtension属性:

 PS C:\> dir *.xlsx | select BaseName,Extension BaseName Extension -------- --------- StackOverflow.com Test Config .xlsx 

如果您将文件名作为string的一部分(例如来自文本文件),我将使用System.IO.Path类中的GetFileNameWithoutExtensionGetExtension静态方法:

 PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("Test Config.xlsx") Test Config PS H:\> [System.IO.Path]::GetExtension("Test Config.xlsx") .xlsx 
 PS C:\Windows\System32\WindowsPowerShell\v1.0>split-path "H:\Documents\devops\tp-mkt-SPD-38.4.10.msi" -leaf tp-mkt-SPD-38.4.10.msi PS C:\Windows\System32\WindowsPowerShell\v1.0> $psversiontable Name Value ---- ----- CLRVersion 2.0.50727.5477 BuildVersion 6.1.7601.17514 PSVersion 2.0 WSManStackVersion 2.0 PSCompatibleVersions {1.0, 2.0} SerializationVersion 1.1.0.1 PSRemotingProtocolVersion 2.1 

如果是从一个文本文件,并假设名称文件被白色空间包围,这是一种方式:

 $a = get-content c:\myfile.txt $b = $a | select-string -pattern "\s.+\..{3,4}\s" | select -ExpandProperty matches | select -ExpandProperty value $b | % {"File name:{0} - Extension:{1}" -f $_.substring(0, $_.lastindexof('.')) , $_.substring($_.lastindexof('.'), ($_.length - $_.lastindexof('.'))) } 

如果是一个文件,你可以根据你的需要使用这样的东西:

 $a = dir .\my.file.xlsx # or $a = get-item c:\my.file.xlsx $a Directory: Microsoft.PowerShell.Core\FileSystem::C:\ps Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 25/01/10 11.51 624 my.file.xlsx $a.BaseName my.file $a.Extension .xlsx 

检查FileInfo对象的BaseName和Extension属性。

使用拆分path

 $filePath = "C:\PS\Test.Documents\myTestFile.txt"; $fileName = (Split-Path -Path $filePath -Leaf).Split(".")[0]; $extension = (Split-Path -Path $filePath -Leaf).Split(".")[1]; 
 PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type') PS C:\Users\joshua> $file.BaseName, $file.Extension file .type 

这是一个适应,如果任何人都好奇。 我需要testingRoboCopy是否成功地将一个文件复制到多个服务器的完整性:

  $Comp = get-content c:\myfile.txt ForEach ($PC in $Comp) { dir "\\$PC\Folder\Share\*.*" | Select-Object $_.BaseName } 

很好,很简单,它显示目录和里面的文件。 如果你想指定一个文件名或扩展名,只需用你想要的*replace。

  Directory: \\SERVER\Folder\Share Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2/27/2015 5:33 PM 1458935 Test.pptx 

去做就对了:

 $file=Get-Item "C:\temp\file.htm" $file.Name $file.Extension