我一直在尝试编写一个 powershell 脚本(我的第一个脚本)来
- 仅解析目录内的文件夹
- 仅选择符合特定命名约定 ('SEASON YEAR') 的文件夹
- 切换名称元素的顺序 ('YEAR SEASON')
我最终使用程序 BulkRenameUtility 来执行此操作,使用正则表达式 ^(\w+) (\d+) 并将标记顺序切换为 $2 $1——但是,我仍在学习 Powershell 并且希望能够在不使用外部程序的情况下执行此操作。
因此,重申一下,在 C:\Users\Test
有文件夹和文件。例如,有些文件夹名为Spring 2015
、 。但是,其他文件夹的名称为。文件的名称为和。Fall 2014
geogex
ENG1A SPRING 2015.odt
untitled_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
}