我试图重命名很多文件,这些文件都位于一个文件夹中,但位于不同的子文件夹中。应重命名文件,以便其名称由文件夹名+原始文件名组成。我想知道是否可以添加条件语句,以便如果文件名已包含文件夹名,则文件名不会更改。下面的代码执行重命名文件的功能,但不包含if语句。
dir -recurse | Rename-Item -NewName {$_.Directory.Name + " - " + $_.Name}
下面的代码是一个示例,说明我如何看待代码:
dir -recurse | if($_.Name -contains $_.Directory.Name) {Rename-Item -NewName {$_.Directory.Name + " - " + $_.Name}}
答案 0 :(得分:3)
这应该做到:
@Override
protected void paintComponent(Graphics g) {
Rectangle rect = getVisibleRect();
g.drawImage(image.getImage(), rect.x, rect.y, rect.width, rect.height, this);
super.paintComponent(g);
}
答案 1 :(得分:2)
Theo's answer运作良好,但是有一个替代既在概念上更简单,又具有明显更好的表现:
您可以利用以下事实:将未更改的文件名传递给-NewName
是安静的无操作,因此您可以放置所有逻辑在-NewName
脚本块中:
Get-ChildItem -File -Recurse |
Rename-Item -NewName {
if ($_.Name -like ($_.Directory.Name + ' - *') { # already renamed
$_.Name # no change
}
else { # rename
$_.Directory.Name ' - ' + $_.Name
}
} -WhatIf
-WhatIf
预览重命名操作;删除它以执行实际的重命名。
与其在脚本块中将ForEach-Object
调用与嵌套的Rename-Item
调用一起使用-这意味着每个输入文件都会一次调用Rename-Item
-解决方案使用具有 single Rename-Item
调用的 single 管道,其中新名称(如果更改)是通过 delay-bind 脚本块-有关详细信息,请参见this answer。
答案 2 :(得分:0)
我正在尝试以接近问题的方式进行尝试。我希望我不必添加另一个foreach。
dir -recurse -file | & {
foreach ($i in $input) {
if(-not ($i.Name.contains($i.Directory.Name))) {
Rename-Item $i.fullname -NewName ($i.Directory.Name + ' - ' + $i.Name) -whatif
}
}
}
或者这样
dir -recurse -file | % {
if(-not ($_.Name.contains($_.Directory.Name))) {
Rename-Item $_.fullname -NewName ($_.Directory.Name + ' - ' + $_.Name) -whatif
}
}