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

Posted

技术标签:

【中文标题】如何在 PowerShell 中使用条件语句重命名文件【英文标题】:How to rename files with a conditional statement in PowerShell 【发布时间】:2020-02-13 04:53:42 【问题描述】:

我正在尝试重命名位于一个文件夹中但位于不同子文件夹中的大量文件。应重命名文件,使其名称由文件夹名 + 原始文件名组成。我想知道您是否可以添加条件语句,以便在文件名已包含文件夹名称时文件名不会更改。下面的代码执行重命名文件的功能,但不包含 if 语句。

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

下面的代码是我想象的代码外观的示例:

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

【问题讨论】:

PowerShell and the -contains operator的可能重复 if 语句不会从管道中读取。请改用Where-Object 你的意思是如果 -not ... .contains()... 【参考方案1】:

应该这样做:

$rootFolder = 'D:\test'
Get-ChildItem -Path $rootFolder -File -Recurse | ForEach-Object 
    $folder = $_.Directory.Name
    if (!($_.Name.StartsWith($folder)))  $_ | Rename-Item -NewName ('0 - 1' -f $folder, $_.Name) 

【讨论】:

【参考方案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 调用的单个 管道,其中新名称(如果更改)通过 delay-bind 脚本块确定 - 请参阅 this answer了解详情。

【讨论】:

【参考方案3】:

我尝试的方式与提出问题的方式接近。我希望我不必添加另一个 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 
   

【讨论】:

以上是关于如何在 PowerShell 中使用条件语句重命名文件的主要内容,如果未能解决你的问题,请参考以下文章

Oracle查询语句中重命名的列在WHERE中无效?

使用 Powershell 递归重命名文件

使用 PowerShell 重命名 zip 以匹配其内容

如果文件存在,Powershell 移动项目重命名

创建现有数据库的副本并使用 Powershell 脚本对其进行重命名

使用 PowerShell 重命名 FTP 上的文件