Powershell 删除完整路径名的扩展名(我不想要文件名)

Powershell remove extension for full path name (I don't want just filename)

搜索时,令我惊讶的是只有获取不带扩展名的文件名的答案,但它们丢弃了路径,而我想保留路径:

那么是否有标准方法,或者我需要自己解析?

您可以使用 -replace 运算符从 FullName 属性 值中删除扩展名:

Get-ChildItem -File |ForEach-Object {
    $_.FullName -replace "$([regex]::Escape($_.Extension))$"
}

加入目录和 BaseName 属性

Get-ChildItem -File | ForEach-Object {
    Join-Path $_.Directory $_.BaseName
}

注:

  • 此答案显示了修改给定路径的解决方案 string.

  • 如果您正在处理 System.IO.FileInfo instances as input, such as output by Get-ChildItem, consider the solution in .

不是最明显的方案,但是很简洁,基于[System.IO.Path]::ChangeExtension()方法:

PS> [IO.Path]::ChangeExtension('C:\path\to\some\file.txt', [NullString]::Value)

C:\path\to\some\file

使解决方案变得模糊的原因是需要传递 [NullString]:Value 以便将真实的 null 值传递给 .NET 方法 - 使用 $null 确实 not 起作用,因为 PowerShell 将其视为 "",即 空字符串 [1],这会导致保留扩展的 . 部分的方法。

稍微不那么晦涩但更冗长的替代方法是 trim 尾随 . 之后:

PS> [IO.Path]::ChangeExtension('C:\path\to\some\file.txt', '').TrimEnd('.')

C:\path\to\some\file

[1] 根据设计,PowerShell 不允许您将 $null 存储在字符串类型的变量中,这意味着 [string] 类型的参数变量包含空默认情况下,字符串甚至传递或分配 $null 都会转换为空字符串。 [NullString]::Value 单例是在 v3 中引入的,专门用于允许将真实的 null 值传递给具有 string 类型参数的 .NET API。