如何在PowerShell中使用条件语句重命名文件

时间:2019-10-16 11:59:53

标签: powershell

我试图重命名很多文件,这些文件都位于一个文件夹中,但位于不同的子文件夹中。应重命名文件,以便其名称由文件夹名+原始文件名组成。我想知道是否可以添加条件语句,以便如果文件名已包含文件夹名,则文件名不会更改。下面的代码执行重命名文件的功能,但不包含if语句。

dir -recurse | Rename-Item -NewName {$_.Directory.Name + " - " + $_.Name}

下面的代码是一个示例,说明我如何看待代码:

dir -recurse | if($_.Name -contains $_.Directory.Name) {Rename-Item -NewName {$_.Directory.Name + " - " + $_.Name}}

3 个答案:

答案 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 
  } 
}