虽然我知道如何在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 部分。
答案 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;
}
如上所示:
$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}$' }