我有一个编号文件列表。这是一个示例(实际上有更多文件):
01 File.sql
02 File.sql
02 another_file.sql
02 a_third_file.sql
03 File.sql
04 File.sql
.....
您会看到文件已编号,但是某些文件具有相同的编号。我想做的是遍历所有这些,然后重新编号以使列表看起来像这样:
01 File.sql
02 File.sql
03 another_file.sql
04 a_third_file.sql
05 File.sql
06 File.sql
07 File.sql
.....
我想出了可以正常使用的Powershell脚本:
$x = 1
Get-ChildItem "*.sql" | Rename-Item -NewName {$_.Name -replace '[0-9][0-9] ', "$x "}
此脚本的作用是遍历所有文件,并删除它们的当前编号,然后将其替换为我在$x
中存储的编号。到目前为止,脚本的唯一错误是所有文件的编号均为1
,因为我没有在任何地方递增它。
我可以在脚本的哪个位置递增$x
?或者也许我必须以某种方式将其重写为循环,以便能够在每次重命名后增加它?
答案 0 :(得分:2)
我想说一个简单快捷的方法是:
$x = 0
foreach ( $item in $( Get-ChildItem "PATH" "*.txt" ) ){
$x++
Rename-Item $item.fullName -newname $( $item.Name -replace '[0-9][0-9] ', "$x " )
}
这不会执行任何错误检查,因此,如果文件名已存在,则该项目将出错。
如果遇到任何错误,也许要进行两次扫描?或在$ x ++之后插入IF(测试路径...)
*编辑-将$ x更改为0,因此第一个重命名为1
答案 1 :(得分:1)
您可以将foreach与replace和简单的正则表达式一起使用...
另外,如果您想将第一个文件之前的0之前的文件都保留为0,例如01/02/03,直到10,我为此添加了if
语句...希望对您有帮助
$i = 1
foreach ($file in Get-ChildItem C:\targetPath) # Change to valid path
{
if ($i -lt 10) {
Rename-Item $file.FullName -NewName "0$i $($file.BaseName -replace '^\d+\s').sql"
}
else {
Rename-Item $file.FullName -NewName "$i $($file.BaseName -replace '^\d+\s').sql"
}
$i++
}
答案 2 :(得分:0)
请注意,您可以使用范围通配符:
Get-ChildItem '[0-9][0-9] *.sql'
如果您确实想这样做,可以尝试对变量进行范围界定:
Rename-Item -NewName {$_.Name -replace '[0-9][0-9] ', "$x "; $global:x++} -whatif
在脚本中使用脚本而非全局脚本。
答案 3 :(得分:0)
总结几个技巧:
Get-ChildItem
放在首位执行,而不会因更改内容而烦恼。^
插入的正则表达式$script:x
/ $global:x
更新重命名{script block}
about_scopes内的变量 $x = 1
(Get-ChildItem "[0-9][0-9] *.sql") |
Rename-Item -NewName {$_.Name -replace '^\d{2}', ("{0:D2}" -f $global:x++} -WhatIf
如果输出看起来正常,请删除结尾的-WhatIf