我正在尝试使用Powershell2.0递归地重命名一堆文件。目录结构如下所示:
Leaflets
+ HTML
- File1
- File2
...
+ HTMLICONS
+ IMAGES
- Image1
- Image2
- File1
- File2
...
+ RTF
- File1
- File2
...
+ SGML
- File1
- File2
...
我使用以下命令:
get-childitem Leaflets -recurse | rename -newname { $_.name.ToLower() }
它似乎重命名了这些文件,但却抱怨其子目录:
Rename-Item : Source and destination path must be different.
我使用robocopy每月重新加载数据,但目录不会更改,因此我可以手动重命名它们。有没有办法让get-children
跳过子目录(比如find Leaflets -type f ...
)?
谢谢。
更新:看起来问题出在已经全是小写的文件上。我尝试将命令更改为:
get-childitem Leaflets -recurse | if ($_.name -ne $_name.ToLower()) rename -newname { $_.name.ToLower() }
但是现在Powershell抱怨说if
不是cmdlet、函数等。我可以通过管道将get-childitem
的输出转换为if
语句吗?
更新2:这是可行的:
$files=get-childitem Leaflets -recurse
foreach ($file in $files)
{
if ($file.name -ne $file.name.ToLower())
{
rename -newname { $_.name.ToLower() }
}
}
发布于 2010-09-30 00:13:23
尽管你已经发布了你自己的答案,但这里有一个变体:
dir Leaflets -r | % { if ($_.Name -cne $_.Name.ToLower()) { ren $_.FullName $_.Name.ToLower() } }
以下是一些要点:
如果您不想重命名目录,可以包括如下内容:
if ((! $_.IsPsContainer) -and $_.Name -cne $_.Name.ToLower()) { ... }
希望这对继续学习和探索PowerShell有帮助。
发布于 2010-09-30 00:51:51
请记住,您可以通过管道直接重命名项目,并使用带有-NewName
参数的脚本块(因为它还接受管道输入)来简化此任务:
Get-ChildItem -r | Where {!$_.PSIsContainer} |
Rename-Item -NewName {$_.FullName.ToLower()}
和别名:
gci -r | ?{!$_.PSIsContainer} | rni -New {$_.FullName.ToLower()}
发布于 2013-10-15 22:41:14
对此稍作调整,如果您只想更新特定类型文件的名称,请尝试以下操作:
get-childitem *.jpg | foreach { if ($_.Name -cne $_.Name.ToLower()) { ren $_.FullName $_.Name.ToLower() } }
这只会将文件夹中的jpg文件小写,而忽略其余文件
https://stackoverflow.com/questions/3822745
复制相似问题