基于分隔符反转文件名,然后截断部分

时间:2013-07-04 11:06:13

标签: powershell

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

原始文件名
星期一,England.txt

新文件名
EnglanMo

公约规则:

  1. 文件名在分隔符(,)周围转换为英格兰,星期一,然后截断为6/2 char

    Englan,莫

  2. 然后删除分隔符

    englanmo.txt

  3. 假设我们星期三,西班牙.txt西班牙是5个字符,这不受任何减少的影响 SpainWe.txt

    所有txt文件都可以在一个目录中访问,也可以从CSV访问,无论什么是最简单的。

3 个答案:

答案 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()
    }