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)
小智 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)
Cod*_*Fox 40
灵感来自@ walid2mi 的答案:
(Get-Item 'c:\temp\myfile.txt').Basename
Run Code Online (Sandbox Code Playgroud)
请注意:这仅在给定文件确实存在时才有效.
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)
wal*_*2mi 22
你可以使用basename属性
PS II> ls *.ps1 | select basename
Run Code Online (Sandbox Code Playgroud)
Ren*_*ger 10
从 PowerShell 6 开始,您将获得不带扩展名的文件名,如下所示:
split-path c:\temp\myfile.txt -leafBase
Run Code Online (Sandbox Code Playgroud)
这里是另一个选择:
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)
扩展 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,我们可以根据要求返回不带扩展名的文件名。