使用 Powershell 2.0 解析和切换文件夹名称的元素
Parse and Switch Elements of Folder Names with Powershell 2.0
我一直在尝试编写一个 powershell 脚本(我的第一个)
- 仅解析目录中的文件夹
- select 仅符合特定命名约定的文件夹 ('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
我不确定这是否是一个有效的开始方向。
如有任何帮助,我们将不胜感激。
这应该可以完成工作。
$Path = "C:\Users\Test"
$regex = "^(Spring|Summer|Fall|Winter)\s+\d{4}$"
Get-ChildItem $Path |
Where-Object {$_.PSIsContainer -and $_.Name -match $regex} |
Rename-Item -NewName {$split = $_.Name -split "\s+"; "{0} {1}" -f $split[1],$split[0]}
我们使用该正则表达式过滤出符合您约定的文件夹。使用特定的季节名称应该更有针对性。只找4个数字,年份就更缺了一点。
其他方法,但对于重命名,我只是在 space 上拆分名称并使用 -f
格式运算符反转输出。
我一直在尝试编写一个 powershell 脚本(我的第一个)
- 仅解析目录中的文件夹
- select 仅符合特定命名约定的文件夹 ('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
我不确定这是否是一个有效的开始方向。
如有任何帮助,我们将不胜感激。
这应该可以完成工作。
$Path = "C:\Users\Test"
$regex = "^(Spring|Summer|Fall|Winter)\s+\d{4}$"
Get-ChildItem $Path |
Where-Object {$_.PSIsContainer -and $_.Name -match $regex} |
Rename-Item -NewName {$split = $_.Name -split "\s+"; "{0} {1}" -f $split[1],$split[0]}
我们使用该正则表达式过滤出符合您约定的文件夹。使用特定的季节名称应该更有针对性。只找4个数字,年份就更缺了一点。
其他方法,但对于重命名,我只是在 space 上拆分名称并使用 -f
格式运算符反转输出。