137

我有一系列字符串,它们是文件的完整路径。我想只保存文件名,没有文件扩展名和前导路径。所以从这里:

c:\temp\myfile.txt

myfile

我实际上并没有遍历目录,在这种情况下basename可以使用 PowerShell 的属性之类的东西,而是我单独处理字符串。

4

14 回答 14

141

解决显示完整路径、目录、文件名或文件扩展名的问题比我想象的要容易得多。

                                           ## Output:
$PSCommandPath                             ## C:\Users\user\Documents\code\ps\test.ps1
(Get-Item $PSCommandPath ).Extension       ## .ps1
(Get-Item $PSCommandPath ).Basename        ## test
(Get-Item $PSCommandPath ).Name            ## test.ps1
(Get-Item $PSCommandPath ).DirectoryName   ## C:\Users\user\Documents\code\ps
(Get-Item $PSCommandPath ).FullName        ## C:\Users\user\Documents\code\ps\test.ps1

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

$ConfigINI                                 ## C:\Users\user\Documents\code\ps\test.ini

其他形式:

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
split-path -parent $PSCommandPath
Split-Path $script:MyInvocation.MyCommand.Path
split-path -parent $MyInvocation.MyCommand.Definition
[io.path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name)
于 2015-09-17T15:34:44.633 回答
137

有一个方便的 .NET 方法:

C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile
于 2012-09-19T22:43:32.187 回答
68

受@walid2mi回答的启发:

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

请注意:这仅在给定文件确实存在时才有效。

于 2014-08-12T09:44:21.527 回答
32

或者

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

或者

"c:\temp\myfile.txt".split('\.')[-2]
于 2012-09-20T12:36:35.267 回答
28

你可以使用basename属性

PS II> ls *.ps1 | select basename
于 2012-09-20T04:57:39.997 回答
12

从 PowerShell 6 开始,您将获得不带扩展名的文件名,如下所示:

split-path c:\temp\myfile.txt -leafBase
于 2019-10-30T14:49:47.137 回答
7

@基思

这里有另一个选择:

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]
于 2012-09-20T18:13:02.443 回答
6

扩展 René Nyffenegger 的回答,对于那些无法访问 PowerShell 版本 6.x 的人,我们使用不测试文件存在的拆分路径:

Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf

这将返回“ myfile.txt ”。如果我们知道文件名中没有句点,我们可以拆分字符串并取第一部分:

(Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf).Split('.') | Select -First 1

或者

(Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf).Split('.')[0]

这将返回“ myfile ”。如果文件名可能包含句点,为了安全起见,我们可以使用以下内容:

$FileName = Split-Path "C:\Folder\SubFolder\myfile.txt.config.txt" -Leaf
$Extension = $FileName.Split('.') | Select -Last 1
$FileNameWoExt = $FileName.Substring(0, $FileName.Length - $Extension.Length - 1)

这将返回“ myfile.txt.config ”。在这里,我更喜欢使用 Substring() 而不是 Replace(),因为前面有句点的扩展名也可以是名称的一部分,如我的示例所示。通过使用 Substring,我们根据请求返回不带扩展名的文件名。

于 2020-04-14T20:46:53.403 回答
4

给定任意路径字符串,System.IO.Path 对象上的各种静态方法给出以下结果。

strTestPath = C:\Users\DAG\Documents\Articles_2018\NTFS_File_Times_in_CMD\PathStringInfo.ps1
GetDirectoryName = C:\Users\DAG\Documents\Articles_2018\NTFS_File_Times_in_CMD
GetFileName = PathStringInfo.ps1
获取扩展 = .ps1
GetFileNameWithoutExtension = PathStringInfo

以下是生成上述输出的代码。

[console]::Writeline( "strTestPath                 = {0}{1}" ,
                      $strTestPath , [Environment]::NewLine );
[console]::Writeline( "GetDirectoryName            = {0}" ,
                      [IO.Path]::GetDirectoryName( $strTestPath ) );
[console]::Writeline( "GetFileName                 = {0}" ,
                      [IO.Path]::GetFileName( $strTestPath ) );
[console]::Writeline( "GetExtension                = {0}" ,
                      [IO.Path]::GetExtension( $strTestPath ) );
[console]::Writeline( "GetFileNameWithoutExtension = {0}" ,
                      [IO.Path]::GetFileNameWithoutExtension( $strTestPath ) );

编写和测试生成上述脚本的脚本发现了一些关于 PowerShell 与 C#、C、C++、Windows NT 命令脚本语言以及几乎所有其他我有经验的东西的不同之处。

于 2018-06-06T22:59:59.807 回答
3

这是一个没有括号的

[io.fileinfo] 'c:\temp\myfile.txt' | % basename
于 2014-10-29T05:14:08.327 回答
3

此脚本在文件夹和子文件夹中搜索并通过删除文件的扩展名来重命名文件

    Get-ChildItem -Path "C:/" -Recurse -Filter *.wctc |

    Foreach-Object {

      rename-item $_.fullname -newname $_.basename

    }
于 2019-11-17T14:16:56.627 回答
2

这可以通过将字符串拆分几次来完成。

#Path
$Link = "http://some.url/some/path/file.name"

#Split path on "/"
#Results of split will look like this : 
# http:
#
# some.url
# some
# path
# file.name
$Split = $Link.Split("/")

#Count how many Split strings there are
#There are 6 strings that have been split in my example
$SplitCount = $Split.Count

#Select the last string
#Result of this selection : 
# file.name
$FilenameWithExtension = $Split[$SplitCount -1]

#Split filename on "."
#Result of this split : 
# file
# name
$FilenameWithExtensionSplit = $FilenameWithExtension.Split(".")

#Select the first half
#Result of this selection : 
# file
$FilenameWithoutExtension = $FilenameWithExtensionSplit[0]

#The filename without extension is in this variable now
# file
$FilenameWithoutExtension

这是没有注释的代码:

$Link = "http://some.url/some/path/file.name"
$Split = $Link.Split("/")
$SplitCount = $Split.Count
$FilenameWithExtension = $Split[$SplitCount -1]
$FilenameWithExtensionSplit = $FilenameWithExtension.Split(".")
$FilenameWithoutExtension = $FilenameWithExtensionSplit[0]
$FilenameWithoutExtension
于 2018-09-19T10:32:03.050 回答
1

下面的命令会将文件夹中的所有文件存储在一个变量中,与扩展名“.txt”匹配:

$allfiles=Get-ChildItem -Path C:\temp\*" -Include *.txt
foreach ($file in $allfiles) {
    Write-Host $file
    Write-Host $file.name
    Write-Host $file.basename
}

$file给出带有路径、名称和扩展名的文件:c:\temp\myfile.txt

$file.name给出文件名和扩展名:myfile.txt

$file.basename只给出文件名:myfile

于 2021-01-07T08:25:50.870 回答
1

这里有几个 PowerShell 5.1 单行选项,它们将路径放在行首。

'c:\temp\myfile.txt' |%{[io.fileinfo]$_ |% basename}

或者

"c:\temp\myfile.txt" | Split-Path -Leaf | %{$_ -replace '\.\w+$'}
于 2021-06-28T18:33:06.680 回答