在powershell中从文件名中删除路径和扩展名

lar*_*ryq 89 directory powershell file

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

c:\temp\myfile.txt
Run Code Online (Sandbox Code Playgroud)

myfile
Run Code Online (Sandbox Code Playgroud)

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

Kei*_*ill 98

有一个方便的.NET方法:

C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile
Run Code Online (Sandbox Code Playgroud)

  • 如今,在 PowerShell v7 上,我只需使用“Split-Path C:\temp\myfile.txt -LeafBase”。 (5认同)
  • @KeithHill 谢谢!-LeafBase 是在 powershell v6 中为其他好奇的人引入的 (2认同)

小智 74

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

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

其他形式:

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

  • 如果在顶部代码片段中的每个示例旁边您都准确显示了将返回的文本,那就太好了. (14认同)
  • @Leonardo `Get-Item` 要求文件存在,否则会抛出错误 (5认同)

Cod*_*Fox 40

灵感来自@ walid2mi 的答案:

(Get-Item 'c:\temp\myfile.txt').Basename
Run Code Online (Sandbox Code Playgroud)

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

  • 这假定文件存在。从文件名中删除扩展名不应该依赖于此。如果要基于不存在的文件名创建文件怎么办?该路径是一个字符串,应视为字符串,而不应假定为现有文件。 (3认同)

wal*_*2mi 27

要么

([io.fileinfo]"c:\temp\myfile.txt").basename
Run Code Online (Sandbox Code Playgroud)

要么

"c:\temp\myfile.txt".split('\.')[-2]
Run Code Online (Sandbox Code Playgroud)

  • 第二个例子不适用于"C:\ Downloads\ReSharperSetup.7.0.97.60.msi".split('\.')[ - 2] (8认同)
  • “假设扩展名是三个字符”并不是一个好的假设。有很多扩展名使用多于或少于三个字符,例如:.psd1、.psm1、.json、.docx、.xslx、.pptx、.appx、.appbundle、.cs、.fs、.c、.h 、.py 等。 (2认同)

wal*_*2mi 22

你可以使用basename属性

PS II> ls *.ps1 | select basename
Run Code Online (Sandbox Code Playgroud)

  • OP说:我实际上并没有遍历目录. (6认同)

Ren*_*ger 10

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

split-path c:\temp\myfile.txt -leafBase
Run Code Online (Sandbox Code Playgroud)

  • 这在 powershell 6 中是正确的。 bog 标准 5.1 中没有 LeafBase (3认同)
  • 感谢您提供的信息,我已相应更新了答案。什么是*沼泽*? (2认同)
  • 抱歉:)在我来自(英国)的地方,“Bog Standard”是一个俚语,指的是完全普通的东西,“香草”版本。 (2认同)

wal*_*2mi 5

@Keith

这里是另一个选择:

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


Pap*_*pis 5

扩展 René Nyffenegger 的回答,对于那些无法访问 PowerShell 6.x 版的人,我们使用 Split Path,它不测试文件是否存在:

Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf
Run Code Online (Sandbox Code Playgroud)

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

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

或者

(Split-Path "C:\Folder\SubFolder\myfile.txt" -Leaf).Split('.')[0]
Run Code Online (Sandbox Code Playgroud)

这将返回“ 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)
Run Code Online (Sandbox Code Playgroud)

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