使用 Powershell 解析和切换文件夹名称的元素

使用 Powershell 解析和切换文件夹名称的元素

我一直在尝试编写一个 powershell 脚本(我的第一个脚本)来

  1. 仅解析目录内的文件夹
  2. 仅选择符合特定命名约定 ('SEASON YEAR') 的文件夹
  3. 切换名称元素的顺序 ('YEAR SEASON')

我最终使用程序 BulkRenameUtility 来执行此操作,使用正则表达式 ^(\w+) (\d+) 并将标记顺序切换为 $2 $1——但是,我仍在学习 Powershell 并且希望能够在不使用外部程序的情况下执行此操作。

因此,重申一下,在 C:\Users\Test

有文件夹和文件。例如,有些文件夹名为Spring 2015、 。但是,其他文件夹的名称为。文件的名称为和。Fall 2014geogexENG1A SPRING 2015.odtuntitled_0.odt

我如何才能将名为“Spring 2015”的文件夹名称更改为“2015 Spring”、“2014 Fall”等?

我能够使用

 gci | ? {$_.PSIsContainer} | select-string -pattern '\d+' 

完成 1 和 2,但我坚持使用它来完成第 3 部分:通过反转名称的元素来实际重命名。我尝试将上述内容放在变量中,如下所示:

gci | ? {$_.PSIsContainer} | select-string -pattern '\d+' | %{$data = $_.line; Write-Output "$data"};

然而,虽然上面的输出正是我想要的文件夹,但数组 $data 似乎只保存了输出的最后一行。例如:

gci | ? {$_.PSIsContainer} | select-string -pattern '\d+' | %{$data = $_.line; Write-Output "$data"};
$data 

将输出:

test 123
test 321
test 321

我不确定这是否是一个有效的方向。

任何帮助将不胜感激。

答案1

不要使用 ,而要Select-String使用对象的属性:

# Path to folder
$Path =  '.\'

# Regex to match 'SEASON YEAR' and extract capture groups
$Regex = '^(\w+)\s(\d+)'

# Get all objects in path
Get-ChildItem -Path $Path |
    # Select only objects that are directory and name matches regex
    Where-Object {$_.PSIsContainer -and $_.Name -match $Regex} |
        # For each such object
        ForEach-Object {
            # Generate new name
            $NewName = $_.Name -replace ($Regex, '$2 $1')

            # Rename object
            Rename-Item -Path $_.FullName -NewName $NewName
        }

相关内容