powershell-提取文件名和扩展名


114

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

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


从文本文件中提取还是从中提取?
CB。

嗨,克里斯蒂安,我已经更新了我的问题。我需要从文件名中提取它。谢谢
信徒2012年

Answers:


173

如果文件是从磁盘中取出的,并且如其他人所述,请使用BaseNameExtension属性:

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

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

如果给您文件名作为字符串的一部分(例如来自文本文件),我将使用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

8
对于System.IO.Path类中更有用的方法,而无需参考MSDN文档,可以使用[System.IO.Path] | Get-Member -Static
Phil

2
请注意,[System.IO.Path]::GetExtension返回的扩展名包括句点(“。”)
奥哈德·施耐德

谢谢@OhadSchneider
m1m1k

24
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

13

如果来自文本文件,并且假定名称文件被空格包围,这是一种方法:

$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


8

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


1
您需要任何特定的信息吗?只需将文件通过管道传递给Get-Member即可显示所有成员;或者浏览至MSDN以查找官方帮助。
谢伊·利维

7

使用分割路径

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

2
请注意,这仅在文件名中没有句点的情况下有效。
Halfdone

2
您可以更改为Split(".")[-1]使其能够处理名称中带有点的文件
phuclv


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                                                                                                             

0

从PowerShell 6.0开始,Split-Path具有-Extenstion参数。这意味着您可以:

$path | Split-Path -Extension

要么

Split-Path -Path $path -Extension

对于$path = "test.txt"这两个版本,将返回.txt,包括句号。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.