我正在尝试向树中无扩展名的文件添加扩展名。
以下命令不能令人满意。如何实现?
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
)
- 完整路径、文件名和扩展名 (
答案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