powershell - 提取文件名和扩展名

cul*_*ter 103 .net powershell powershell-2.0

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

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

Goy*_*uix 159

如果文件正在脱离磁盘并且正如其他人所说,请使用BaseNameExtension属性:

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

BaseName                                Extension
--------                                ---------
StackOverflow.com Test Config           .xlsx  
Run Code Online (Sandbox Code Playgroud)

如果您将文件名作为字符串的一部分(例如来自文本文件),我将使用System.IO.Path类中的GetFileNameWithoutExtensionand GetExtensionstatic方法:

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

  • 对于System.IO.Path类中更有用的方法而不参考MSDN文档,您可以使用`[System.IO.Path] | Get-Member -Static` (7认同)
  • 注意`[System.IO.Path] :: GetExtension`返回扩展名*包括句点(“。”)*。 (2认同)

Str*_*aff 23

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
Run Code Online (Sandbox Code Playgroud)

  • 这显然不是一个答案 (2认同)

CB.*_*CB. 12

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

$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('.'))) }
Run Code Online (Sandbox Code Playgroud)

如果是文件,您可以根据自己的需要使用以下内容:

$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
Run Code Online (Sandbox Code Playgroud)


Esp*_*o57 11

去做就对了:

$file=Get-Item "C:\temp\file.htm"
$file.Basename 
$file.Extension
Run Code Online (Sandbox Code Playgroud)

  • 如果文件存在,这是理想的答案,否则您将收到“ObjectNotFound”异常。 (5认同)
  • 我认为应该是 `$file.Basename` (2认同)

Jaq*_*nek 9

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


Sha*_*evy 8

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


小智 5

使用分割路径

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

  • 您可以更改为`Split(".")[-1]` 以使其适用于名称中带有点的文件 (5认同)
  • 请注意,这仅在文件名中没有句点的情况下有效。 (2认同)