我需要重命名数百个文件才能遵循新的命名约定,但我遇到了很多麻烦。这确实需要在powershell或VBS中编写脚本,以便我们可以定期自动执行任务。
原始文件名
星期一,England.txt
新文件名
EnglanMo
公约规则:
文件名在分隔符(,)周围转换为英格兰,星期一,然后截断为6/2 char
Englan,莫
然后删除分隔符
englanmo.txt
假设我们星期三,西班牙.txt西班牙是5个字符,这不受任何减少的影响 SpainWe.txt
所有txt文件都可以在一个目录中访问,也可以从CSV访问,无论什么是最简单的。
答案 0 :(得分:1)
如果没有文件路径的确切详细信息,它将在哪里运行,等等,您必须将其调整为指向适当的路径。
$s= "Monday,England.txt";
#$s = "Wednesday,Spain.txt";
$nameparts = $s.split(".")[0].split(",");
if ($nameparts[1].length -gt 6) {
$newname = $nameparts[1].substring(0,6);
} else {
$newname = $nameparts[1];
}
if ($nameparts[0].length -gt 2) {
$newname += $nameparts[0].substring(0,2);
} else {
$newname += $nameparts[0];
}
$newname = $newname.toLower() + "."+ $s.split(".")[1];
$newname;
get-item $s |rename-item -NewName $newname;
我确信这不是最有效/优雅的方法,但它适用于您的两个测试用例。
答案 1 :(得分:0)
我认为你应该能够通过在PowerShell中将字符串拆分为数组然后记录数组来实现这一点。
例如:
$fileNameExtension = "Monday,England.txt";
$fileName = $fileNameExtension.split("."); // gets you an array [Monday,England][txt]
$fileparts = $fileName.split(","); // gets you an array [Monday][England]
//Create the new substring parts, notice you can now pull items from the array in any order you need,
//You will need to check the length before using substringing
$part1 = $fileparts[1].substring(0,5);
$part2 = $fileparts[0].substring(0,2);
//Now construct the new file name by rebuilding the string
$newfileName = $part1 + $part2 + “.” + $fileName[1];
答案 2 :(得分:0)
使用Get-ChildItem
获取文件,然后使用符合条件的文件,使用正则表达式捕获星期几的前两个字符和位置的前六个字符,然后使用这些捕获创建一个新的文件名。这是我最好的猜测。在-WhatIf
cmdlet上使用Move-Item
,直到获得正则表达式和目标路径正确。
Get-ChildItem C:\Path\To\Files *.txt |
Where-Object { $_.BaseName -matches '^([^,]{2})[^,]*,(.{1,6})' } |
Move-Item -WhatIf -Destination {
$newFileName = '{0}{1}.txt' -f $matches[1],$matches[2]
Join-Path C:\Path\To\Files $newFileName.ToLower()
}