powershell - 提取文件名和扩展名

时间:2012-03-20 14:12:56

标签: .net powershell powershell-v2.0

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

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

10 个答案:

答案 0 :(得分:146)

如果文件已从磁盘上移除,而且正如其他人所说,请使用BaseNameExtension属性:

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

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

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

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

答案 1 :(得分:20)

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

答案 2 :(得分: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

答案 3 :(得分:8)

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

答案 4 :(得分:8)

PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type')
PS C:\Users\joshua> $file.BaseName, $file.Extension
file
.type

答案 5 :(得分:5)

使用拆分路径

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

答案 6 :(得分:2)

就这样做:

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

答案 7 :(得分: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                                                                                                             

答案 8 :(得分:0)

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

$path | Split-Path -Extension

Split-Path -Path $path -Extension

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

答案 9 :(得分:0)

如果 [System.IO.Path]::GetFileNameWithoutExtension() 难以输入或记忆:

("file.name.ext.w..dots.ext" -split '\.' | select -SkipLast 1) -join '.'
# >> file.name.ext.w..dots

"file.name.ext.w..dots.ext" -split '\.' | select -Last 1
# >> ext

注意事项:

-split 采用正则表达式(默认情况下),因此 . 必须被转义

我认为没有“语言环境”名称。ext 文件名分隔符,是吗?

-SkipLast 已在 v5.0 中添加

.NET 函数 [System.IO.Path]::GetExtension() 返回扩展名包括'.'字符;以上返回它没有

必须在拆分后重新加入字符串可能会改变结果,我想,在不寻常的情况下。或者,如果您对重新加入已经加入的字符串感到不舒服,可以:

$file = "file.name.ext.w..dots.ext"
$ext = $file -split '\.' | select -Last 1
$name = $file.Substring(0, $file.LastIndexOf(".$ext"))