复杂文件重命名

时间:2011-01-07 23:11:16

标签: powershell

我在一个文件夹中有大约100个文件。我想重命名这些文件。文件格式类似于

AB1234.gif    
B3245.gif  
AB2541.gif  
AB11422.jpg 

依旧......

输出文件应为

AB-0111-1.gif
B-0111-2.gif
AB-0111-3.gif
AB-0111-4.jpg

逻辑将是

for(int n=0;n<files.count;n++){
    if(file is starting with AB)
        fileName = AB + "-0111" + n;
    if(file is starting with B)
        fileName = B + "-0111" + n;
}

使用PowerShell脚本可以实现这一点吗?

2 个答案:

答案 0 :(得分:2)

使用您描述的文件名格式,您可以使用powershell -replace运算符将中间数字替换为您想要的表达式。唯一棘手的部分是你必须在循环项目时维护一个计数器。它看起来像这样:

dir | foreach -begin{$cnt = 1} -process { mv $_ ($_.Name -replace '\d+',"-0111-$cnt"); $cnt += 1}

答案 1 :(得分:1)

您可以使用[System.IO.Path] :: GetExtension获取文件的扩展名,如下所示:

$ext = [System.IO.Path]::GetExtension('AB1234.gif')

您可以使用$matches变量获取文件名的第一个字母字符,如下所示:

if ('AB1234.gif' -match '^\D*') { $first = $matches[0]; }

您可以像这样构建新文件名:

$first + '-0111-' + '1' + $ext

您可以通过检查exists属性,将上面的'1'替换为可以递增的变量:

$i = 1;
while (test-path ($first + '-0111-' + $i + $ext)) {$i++}

当此循环完成后,您将拥有$first + '-0111-' + $i + $ext所需的文件名,您可以使用此文件使用Rename-File重命名该文件:

Rename-File 'AB1234.gif' ($first + '-0111-' + $i + $ext)

现在,将所有内容包装在一个循环中,你应该拥有它:

dir | ForEach-Object { ... }

进行测试时,将-whatif参数添加到Rename-File命令的末尾,PS将告诉您它将执行的操作,而不是实际执行操作。

感谢, 标记