我有一系列字符串,它们是文件的完整路径。我只想保存文件名,没有文件扩展名和前导路径。所以从这个:
c:\temp\myfile.txt
到
myfile
我实际上并没有在目录中进行迭代,在这种情况下可以使用类似powershell的basename
属性,而是单独使用字符串。
答案 0 :(得分:92)
有一个方便的.NET方法:
C:\PS> [io.path]::GetFileNameWithoutExtension("c:\temp\myfile.txt")
myfile
答案 1 :(得分:60)
比我想象的更容易解决显示完整路径,目录,文件名或文件扩展名的问题。
$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
其他形式:
$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)
答案 2 :(得分:28)
答案 3 :(得分:26)
或
([io.fileinfo]"c:\temp\myfile.txt").basename
或
"c:\temp\myfile.txt".split('\.')[-2]
答案 4 :(得分:21)
您可以使用 basename 属性
PS II> ls *.ps1 | select basename
答案 5 :(得分:5)
这里有另一种选择:
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]
答案 6 :(得分:2)
给定任意路径字符串,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 GetExtension = .ps1 GetFileNameWithoutExtension = PathStringInfo
以下是生成上述输出的代码。
let test1 = {
location: {
state: {
className: 'myCalss'
}
}
};
let test2 = {
params: {
className: 'myCalss'
}
};
function getClassName(obj) {
if(typeof obj === "object" && 'className' in obj) {
return obj.className
}
const keys = Object.keys(obj)
for(let i = 0; i < keys.length; i++) {
let key = keys[i]
let res = getClassName(obj[key])
if(res) return res
}
return null
}
console.log(getClassName(test1), getClassName(test2))
编写和测试生成上述内容的脚本发现了一些关于PowerShell如何与C#,C,C ++,Windows NT命令脚本语言以及我有任何经验的其他内容不同的怪癖。
答案 7 :(得分:2)
扩大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,我们将按要求返回不带扩展名的文件名。
答案 8 :(得分:1)
这是没有括号的一个
[io.fileinfo] 'c:\temp\myfile.txt' | % basename
答案 9 :(得分:1)
从PowerShell 6开始,您将获得没有扩展名的文件名,如下所示:
this.setState({ PQIOver: (this.state.SROver !== 0 && this.state.RQIOver !== 0) ? Math.sqrt(SRTypeOptions[this.state.SROver].label * RQITypeOptions[this.state.RQIOver].label).toFixed(2) : null });
答案 10 :(得分: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
答案 11 :(得分:0)
这可以通过将字符串拆分几次来完成。
#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
答案 12 :(得分:0)
此脚本在文件夹和子文件夹中搜索,并通过删除扩展名重命名文件
Get-ChildItem –Path "C:\" -Recurse -Filter *.wctc |
Foreach-Object {
rename-item $_.fullname -newname $_.basename
}
答案 13 :(得分:0)
这里有几个 PowerShell 5.1 单行选项,它们将路径放在行首。
'c:\temp\myfile.txt' |%{[io.fileinfo]$_ |% basename}
或
"c:\temp\myfile.txt" | Split-Path -Leaf | %{$_ -replace '\.\w+$'}