Windows 如何使用文件名中的现有Unix时间重命名多个文件?
虽然我知道如何在PHP中实现这一点,但安装IIS、安装PHP只是为了实现这一点是没有意义的 我有一个文件夹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
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运算符,但我们可以在可扩展字符串中使用子表达式$(…)
cmdlet将负责重命名Rename-Item
一个更具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
,如果结果中没有扩展部分,则进行重命名。谢谢。这是最容易实现的,效果令人惊讶。这正是我想要的。