首页 > 解决方案 > 使用 powershell 使用正则表达式重命名多个目录名称

问题描述

我在某个时候卡住了。假设以下目录:

d:\example
             0 test1_123.txt
<DIR>          test1_123_abc0
             0 test2.txt
<DIR>          test2_123
<DIR>          test3_123_abc1
<DIR>          test4_test0_abc0

我现在想使用所有目录名称的正则表达式 '_abc*' 删除后缀。我尝试了以下方法:

Get-ChildItem d:\example\ -Directory | foreach { rename-item $_ $_ -replace '_abc.' }

有人知道这里出了什么问题并可以分享解决方案吗?

标签: regexpowershelldirectory

解决方案


这是解决问题的一种方法……[]

它能做什么 ...

  • 创建一些文件和目录以
    在准备好实际执行此操作时进行测试,只需删除整个#region/#endregion块。
  • 设置目标目录、目录过滤器和正则表达式删除模式
    如果您还想删除_abc末尾没有任何数字,请将+ [一个或多个] 替换为*[零或多个]。
  • 获取匹配目录的列表
  • 遍历该列表
  • 通过剥离与正则表达式匹配的结尾来重命名目录

请注意,这不处理名称冲突。如果您两次运行此代码,您将test5_abc666在重命名为test5... 并且已经存在具有该名称的目录时看到这种情况。[咧嘴笑]

编码 ...

#region >>> make some test files & dirs
@(
'test1_123.txt'
'test2.txt'
'test3_abc9.log'
) | ForEach-Object {
    $Null = New-Item -Path $env:TEMP -Name $_ -ItemType File -ErrorAction SilentlyContinue
    }
@(
'test1_123_abc0'
'test2_123'
'test3_123_abc1'
'test4_test0_abc0'
'test5_abc666'
) | ForEach-Object {
    $Null = New-Item -Path $env:TEMP -Name $_ -ItemType Directory -ErrorAction SilentlyContinue
    }
#endregion >>> make some test files & dirs

$TargetDir = $env:TEMP
$Filter = '*_abc*'
$Regex_ThingToRemove = '_abc\d+$'

$DirList = Get-ChildItem -LiteralPath $TargetDir -Directory -Filter $Filter
foreach ($DL_Item in $DirList)
    {
    Rename-Item -LiteralPath $DL_Item.FullName -NewName ($DL_Item.Name -replace $Regex_ThingToRemove)
    }

推荐阅读