0

我需要重命名数百个文件以遵循新的命名约定,但我遇到了可怕的麻烦。这确实需要在 powershell 或 VBS 中编写脚本,以便我们可以定期自动执行任务。

原始文件名
Monday,England.txt

新文件名
EnglanMo

公约规则:

  1. 文件名在分隔符 (,) 周围反转为 England,Monday,然后截断为 6/2 字符

    英格兰,莫

  2. 然后删除分隔符

    英语.txt

假设我们有星期三,Spain.txt 西班牙为 5 个字符,这不会受到任何减少
SpainWe.txt

所有 txt 文件都可以在一个目录中访问,或者从 CSV 访问,无论哪种最简单。

4

3 回答 3

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;

我确定这不是最有效/最优雅的方法,但它适用于您的两个测试用例。

于 2013-07-04T11:24:26.407 回答
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];
于 2013-07-04T11:50:43.050 回答
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()
    }
于 2013-07-04T13:05:41.180 回答