我需要从 my.file.xlsx 中提取文件名和扩展名。我不知道文件名或者扩展名,名字中可能有更多的点,所以我需要从右边搜索字符串,当我找到第一个点(或者从左边找到最后一个)时,从那个点提取右边的部分和左边的部分。
怎么做到的?
如果是来自一个文本文件,并且假定名称文件被空白包围,这是一种方法:
$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 属性。
如果文件从磁盘上下来,正如其他人所说,使用 BaseName和 Extension属性:
BaseName
Extension
PS C:\> dir *.xlsx | select BaseName,Extension BaseName Extension -------- --------- StackOverflow.com Test Config .xlsx
如果给定的文件名是字符串的一部分(比如来自文本文件) ,我将使用来自 系统,组织,路径类的 GetFileNameWithoutExtension和 GetExtension静态方法:
GetFileNameWithoutExtension
GetExtension
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参数,这意味着你可以:
Split-Path
-Extenstion
$path | Split-Path -Extension
或者
Split-Path -Path $path -Extension
对于 $path = "test.txt"两个版本将返回 .txt,包括完整的停止。
$path = "test.txt"
.txt
如果 [System.IO.Path]::GetFileNameWithoutExtension()很难输入或记住:
[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接受正则表达式(默认情况下) ,因此必须转义 .
-split
.
我想没有“ locale”这个名字吧. ext 文件名分隔符,有吗?
-SkipLast是在 v5.0中添加的
-SkipLast
NET 函数 [System.IO.Path]::GetExtension()返回扩展名 包括的’.’字符; 上面的函数返回它的 没有
[System.IO.Path]::GetExtension()
在分裂后必须重新连接字符串可能会改变结果,我想,在不寻常的情况下。或者,如果你对重新加入已经加入的字符串感到不舒服,你可以:
$file = "file.name.ext.w..dots.ext" $ext = $file -split '\.' | select -Last 1 $name = $file.Substring(0, $file.LastIndexOf(".$ext"))