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

时间:2012-09-19 22:39:36

标签: file powershell directory

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

c:\temp\myfile.txt

myfile

我实际上并没有在目录中进行迭代,在这种情况下可以使用类似powershell的basename属性,而是单独使用字符串。

14 个答案:

答案 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)

受@ {walid2mi的answer启发:

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

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

答案 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)

@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]

答案 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+$'}