在PowerShell中从文件名中删除path和扩展名

我有一系列文件的完整path的string。 我想只保存文件名,没有文件扩展名和前导path。 所以从这个:

c:\temp\myfile.txt 

 myfile 

我实际上并没有遍历一个目录,在这种情况下,可以使用像powershell的basename属性,而是我单独处理string。

有一个方便的.NET方法:

 C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt") myfile 

比我想象的更容易解决显示完整path,目录,文件名或文件扩展名的问题。

 $PSCommandPath (Get-Item $PSCommandPath ).Extension (Get-Item $PSCommandPath ).Basename (Get-Item $PSCommandPath ).Name (Get-Item $PSCommandPath ).DirectoryName (Get-Item $PSCommandPath ).FullName $ConfigINI = (Get-Item $PSCommandPath ).DirectoryName+"\"+(Get-Item $PSCommandPath ).BaseName+".ini" $ConfigINI 

其他forms:

 $scriptPath = split-path -parent $MyInvocationMyCommand.Definition split-path -parent $PSCommandPath Split-Path $script:MyInvocation.MyCommand.Path split-path -parent $MyInvocation.MyCommand.Definition [io.path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name) 

要么

 ([io.fileinfo]"c:\temp\myfile.txt").basename 

要么

 "c:\temp\myfile.txt".split('\.')[-2] 

灵感来自@ walid2mi的回答 :

 (Get-Item 'c:\temp\myfile.txt').Basename 

虽然应该指出,这只有在给定文件确实存在时才有效。

你可以使用basename属性

 PS II> ls *.ps1 | select basename 

@Keith,

这里另一个select:

 PS II> $f="C:\Downloads\ReSharperSetup.7.0.97.60.msi" PS II> $f.split('\')[-1] -replace '\.\w+$' PS II> $f.Substring(0,$f.LastIndexOf('.')).split('\')[-1] 

这是没有括号的一个

 [io.fileinfo] 'c:\temp\myfile.txt' | % basename