我有一系列字符串,它们是文件的完整路径。我想只保存文件名,没有文件扩展名和前导路径。所以从这里:
c:\temp\myfile.txt
至
myfile
我实际上并没有遍历目录,在这种情况下basename
可以使用 PowerShell 的属性之类的东西,而是我单独处理字符串。
我有一系列字符串,它们是文件的完整路径。我想只保存文件名,没有文件扩展名和前导路径。所以从这里:
c:\temp\myfile.txt
至
myfile
我实际上并没有遍历目录,在这种情况下basename
可以使用 PowerShell 的属性之类的东西,而是我单独处理字符串。
解决显示完整路径、目录、文件名或文件扩展名的问题比我想象的要容易得多。
## 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)
有一个方便的 .NET 方法:
C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile
或者
([io.fileinfo]"c:\temp\myfile.txt").basename
或者
"c:\temp\myfile.txt".split('\.')[-2]
你可以使用basename属性
PS II> ls *.ps1 | select basename
从 PowerShell 6 开始,您将获得不带扩展名的文件名,如下所示:
split-path c:\temp\myfile.txt -leafBase
@基思,
这里有另一个选择:
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]
扩展 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,我们根据请求返回不带扩展名的文件名。
给定任意路径字符串,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 命令脚本语言以及几乎所有其他我有经验的东西的不同之处。
这是一个没有括号的
[io.fileinfo] 'c:\temp\myfile.txt' | % basename
此脚本在文件夹和子文件夹中搜索并通过删除文件的扩展名来重命名文件
Get-ChildItem -Path "C:/" -Recurse -Filter *.wctc |
Foreach-Object {
rename-item $_.fullname -newname $_.basename
}
这可以通过将字符串拆分几次来完成。
#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
下面的命令会将文件夹中的所有文件存储在一个变量中,与扩展名“.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
这里有几个 PowerShell 5.1 单行选项,它们将路径放在行首。
'c:\temp\myfile.txt' |%{[io.fileinfo]$_ |% basename}
或者
"c:\temp\myfile.txt" | Split-Path -Leaf | %{$_ -replace '\.\w+$'}