使用 PowerShell 向文件树中的文件添加扩展名?

使用 PowerShell 向文件树中的文件添加扩展名?

我正在尝试向树中无扩展名的文件添加扩展名。

以下命令不能令人满意。如何实现?

get-childitem * -recurse  -exclude *.h | where { ! $_.PSIsContainer }
    | rename-item -newname {$_.name -replace "(.*)","$1.h"} -whatif

因此,我搜索文件(而不是目录),它们不是.*\.h,然后我重命名它们,以便它们具有新的扩展名。

我尝试的另一个替换命令是,{$_.name -replace '(.*)','$1.h'}但这会添加两次扩展。我只需要添加一次扩展。

编辑:尝试排除.h 文件并且足够了,但是对于这个问题,更一般的“无扩展”更有趣并且是我正在寻找的。

答案1

不要使用-replace函数来获取新文件名值。请使用basename属性和显式.h扩展名作为参数的值-NewName

Get-ChildItem -Path "C:\Folder\Path\*" -Recurse -Exclude *.h | 
Where-Object { ! $_.PSIsContainer } | 
Rename-Item -NewName { "$($_.basename).h"} -WhatIf

支持资源

  • Get-ChildItem通常返回一个FileInfo对象。这些对象包含一些有用的属性,其中包括...

    • 完整路径、文件名和扩展名 ( FullName),
    • 路径本身(DirectoryName),
    • 文件名 ( Name),以及
    • 不带扩展名的文件名 ( BaseName)

    来源

  • 重命名项目

  • PowerShell 运算符

答案2

我认为没有任何充分的理由使用:

  • Where-Object { ! $_.PSIsContainer }

当你有-File当前版本中的参数电源外壳

虽然这是一个简单的重命名,但我已经习惯使用-f格式操作员:

  • -NewName { '{0}{1}' -f $_.BaseName , $NewExtension }

(扩展名可以硬编码到格式字符串中,但这有助于成为可重用函数的基础)

我的看法是:

$MyFolder      = 'C:\Some\Folder\Path'
$NewExttension = '.h'

Get-ChildItem -Path $MyFolder -File -Recurse | ? Extension -eq '' |
    Rename-Item -NewName { '{0}{1}' -f $_.BaseName , $NewExtension } -Whatif

但作为控制台的一次性命令可以缩短为:

gci $MyFolder -af -s | ? Extension -eq '' | ren -new {"$($_.BaseName)$NewExtension"}

答案3

经过最少的修改,问题出在正则表达式中,其中 * 匹配 0(并且不会消除零长度匹配) 和 + 至少一个;随后,以下命令将按预期工作(如果只有 .h 和无扩展名的文件):

get-childitem * -recurse  -exclude *.h | where { ! $_.PSIsContainer }
    | rename-item -newname {$_.name -replace '(.+)','$1.h'} -whatif

相关内容