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

Windows 如何使用文件名中的现有Unix时间重命名多个文件?,windows,file,powershell,batch-file,Windows,File,Powershell,Batch File,虽然我知道如何在PHP中实现这一点,但安装IIS、安装PHP只是为了实现这一点是没有意义的 我有一个文件夹D:\Data,其中有几个子文件夹。这些文件夹包含使用程序创建的备份文件,该程序在名称中添加时间戳,以允许备份文件的多个副本 这些文件需要命名为: usera.dat 但他们目前的名字是: usera.dat.17383947323.dat 在PHP中,我会将文件名加载到字符串中,在“.”上分解字符串,然后使用[0]和[3]元素重命名文件,即不使用循环读取目录: $filename

虽然我知道如何在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部分。

将此文件从PHP转换为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
}
如上所示:

  • PowerShell没有
    explode()
    函数,但我们可以在任何字符串上使用
    String.Split()
    方法,并获取字符串数组
  • 不是PowerShell中的字符串concat运算符,但我们可以在可扩展字符串中使用子表达式
    $(…)
  • Rename-Item
    cmdlet将负责重命名

一个更具PowerShell特色的解决方案是利用管道:

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
Rename Item
无疑是您希望在此处使用的命令

包含许多有用的指针,但似乎更简单、更可靠的方法是删除最后两个扩展,假设文件夹树中的所有文件都有以下两个无关的扩展名:

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

从提示符处批量显示一个班轮:

@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
es rename命令用于测试。测试后删除
echo
关键字以执行重命名

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


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

谢谢。这是最容易实现的,效果令人惊讶。这正是我想要的。