【发布时间】:2011-04-18 21:00:07
【问题描述】:
我正在尝试使用 Powershell 2.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() }
}
}
【问题讨论】:
-
至少在 PowerShell 7 中,如果新名称与旧名称相同,
Rename-Item不会出错。我不确定这种行为在哪个版本中发生了变化。但是您的第一次尝试将gci管道连接到rename-item现在可以了。
标签: powershell rename recursive-descent