Powershell-提取文件名和扩展名

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

怎么做到的?

293704 次浏览

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

$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 属性。

如果文件从磁盘上下来,正如其他人所说,使用 BaseNameExtension属性:

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


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

如果给定的文件名是字符串的一部分(比如来自文本文件) ,我将使用来自 系统,组织,路径类的 GetFileNameWithoutExtensionGetExtension静态方法:

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

如果有人好奇的话,这是一个改编。我需要测试 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
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
PS C:\Users\joshua> $file = New-Object System.IO.FileInfo('file.type')
PS C:\Users\joshua> $file.BaseName, $file.Extension
file
.type

使用 Split-Path

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

照我说的做:

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

在 PowerShell 6.0中,Split-Path有一个 -Extenstion参数,这意味着你可以:

$path | Split-Path -Extension

或者

Split-Path -Path $path -Extension

对于 $path = "test.txt"两个版本将返回 .txt,包括完整的停止。

如果 [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接受正则表达式(默认情况下) ,因此必须转义 .

我想没有“ locale”这个名字吧. 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"))