如何用文件名中的现有Unix时间重命名多个文件?

时间:2017-12-17 16:30:38

标签: windows file powershell batch-file

虽然我知道如何在PHP中执行此操作,但安装IIS并安装PHP只是为了完成此操作。

我有一个文件夹D:\Data,里面有几个子文件夹。这些文件夹包含的文件是使用程序创建的备份,该程序为名称添加时间戳以允许备份文件的多个副本。

这些文件需要命名为:

usera.dat

但他们目前被命名为:

usera.dat.17383947323.dat  

在PHP中,我会将文件名加载到字符串中,然后在"。"上展开字符串,然后使用[0]和[3]元素重命名文件以重命名文件,即没有循环来读取目录:

$filename = $existing_file
$explodename = explode(".",$filename);
$newfilename = $explodename[0] . "." . $explodename[3];
rename($filename, $newfilename);

是否有人建议如何使用PowerShell或循环覆盖D:\Data中所有子文件夹的批处理文件?

现在我手动编辑每个文件,删除额外的 Unix time stamp.dat 部分。

3 个答案:

答案 0 :(得分:2)

将这个从PHP翻译成PowerShell应该是轻而易举的,让我们试一试:

#include <stdio.h>
#define N 1000

int main() {

    int i = 0;
    int j = 0;
    char str[N];

    while (str[i] != '\n') {
        printf("element number str[%d] : ", i);
        scanf("%s", &str[i]);
        i++;
    }

    printf("The string is: ");

    while (j < i) {

        printf("%s", str[j]);
        j += 1;
    }

    return 0;
}

如上所示:

  • PowerShell没有$files = Get-ChildItem -Filter *.dat.*.dat foreach($file in $files){ $filename = $file.Name $explodename = $filename.Split('.') $newfilename = "$($explodename[0]).$($explodename[3])" Rename-Item $file.FullName -NewName $newfilename } 函数,但我们可以对任何字符串使用explode()方法并获取字符串数组
  • String.Split()不是PowerShell中的字符串连接运算符,但我们可以在可扩展字符串中使用子表达式.
  • $(...) cmdlet将负责重命名

更多PowerShell惯用解决方案是利用管道:

Rename-Item

您也可以使用正则表达式模式代替Get-ChildItem -Filter *.dat.*.dat | Rename-Item -NewName {$explodename = $_.Name.Split('.');"$($explodename[0]).$($explodename[3])"} 方法和字符串连接:

Split()

或者使用Get-ChildItem -Filter *.dat.*.dat | Rename-Item -NewName {$_.Name -replace '^([^\.])\..*\..*\.([^\.])$','$1.$2'} 运算符进行连接:

-join

无论你喜欢什么,Get-ChildItem -Filter *.dat.*.dat | Rename-Item -NewName {$_.Name.Split('.')[0,3] -join '.'} Get-ChildItem绝对是你想要在这里使用的命令

答案 1 :(得分:1)

来自提示的批量单行:

@FOR /r "U:\sourcedir" %a IN (*) DO @FOR %b IN ("%~na") DO @FOR %c IN ("%~nb") DO @IF "%~xc" neq "" ECHO REN "%a" "%~nxc"

注意:echo是用于测试的重命名命令。测试后删除echo关键字以执行重命名。

我使用u:\sourcedir作为测试目录。

翻译:对于子树中的每个文件名(%%a),仅取名称部分并分配给%%b,重复%%c,如果结果中没有扩展部分,然后重命名。

答案 2 :(得分:0)

Mathias R. Jessen's answer包含许多有用的指针,但似乎更简单,更健壮的方法是简单地删除 final 2 扩展,假设 all 文件夹树中的文件有以下两个无关的扩展名:

Get-ChildItem -File -Recurse D:\Data |
  Rename-Item -NewName { $_.Name -replace '(\.[^.]*){2}$' }
相关问题