2012-03-20 1741 views
86

我需要从文件名中提取文件名和扩展名。 my.file.xlsx。我不知道文件或扩展名的名称,名称中可能有更多的点,所以我需要从右侧搜索字符串,并且当我找到第一个点(或从左侧的最后一个)时,提取该部分右侧和该点左侧的部分。powershell - 提取文件名和扩展名

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

+0

从文本文件或提取什么? – 2012-03-20 14:17:56

+0

嗨克里斯蒂安,我已经更新了我的问题。我需要从文件名中提取它。谢谢 – culter 2012-03-20 14:23:33

回答

125

如果文件即将关闭磁盘,如其他人所说,使用BaseNameExtension属性:

PS C:\> dir *.xlsx | select BaseName,Extension 

BaseName        Extension 
--------        --------- 
StackOverflow.com Test Config   .xlsx 

如果您指定的文件名作为字符串的一部分(比如从一个文本文件来),我会使用GetFileNameWithoutExtensionGetExtension静态方法从System.IO.Path类:

PS C:\> [System.IO.Path]::GetFileNameWithoutExtension("Test Config.xlsx") 
Test Config 
PS H:\> [System.IO.Path]::GetExtension("Test Config.xlsx") 
.xlsx 
+5

对于System.IO.Path类中没有提及MSDN文档的更有用的方法,可以使用'[System.IO.Path] | Get-Member -Static' – Phil 2013-02-28 20:03:29

+0

请注意,'[System.IO.Path] :: GetExtension'返回包含句号(“。”)*的扩展名*。 – 2016-05-08 13:15:35

11

如果是从一个文本文件,并且假定名的文件用空格这个被包围的方式:

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

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

+1

任何特定的信息后?只需将一个文件传给Get-Member即可将其所有成员或成员浏览到MSDN以查找官方帮助。 – 2013-03-13 07:49:28

0

这是一种适应,如果有人好奇。我需要测试ROBOCOPY是否成功复制一个文件到多台服务器用于其完整性:

$Comp = get-content c:\myfile.txt 

ForEach ($PC in $Comp) { 
    dir "\\$PC\Folder\Share\*.*" | Select-Object $_.BaseName 
} 

尼斯和简单,它显示了目录和里面的文件。如果你想指定一个文件名或扩展名,只需将*替换为你想要的。

Directory: \\SERVER\Folder\Share 

Mode    LastWriteTime  Length Name                                    
----    -------------  ------ ----                                    
-a---   2/27/2015 5:33 PM 1458935 Test.pptx                            
18
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 
4
PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type') 
PS C:\Users\joshua> $file.BaseName, $file.Extension 
file 
.type 
4

使用拆分路径

$filePath = "C:\PS\Test.Documents\myTestFile.txt"; 
$fileName = (Split-Path -Path $filePath -Leaf).Split(".")[0]; 
$extension = (Split-Path -Path $filePath -Leaf).Split(".")[1]; 
0

只是做:

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