Переименовывать ли файлы Powershell в новые файлы, помещаемые в какую-либо часть дерева каталогов? - PullRequest
1 голос
/ 21 октября 2011

Я никогда не использовал Powershell (или VBScript), так как я новичок в IT-Admin и был бы признателен за некоторые рекомендации по переименованию файлов.

Ежедневно я буду загружать файлы, использующие Filezilla, вручную из SFTP-соединения в локальный каталогизатор YYYYMMDD (хотя позже я захочу написать автоматизированное задание, которое будет формировать меня по расписанию). Я хотел бы настроить какую-то задачу, чтобы, когда файлы попадали в каталог distination, они переименовывались.

Для сегодняшней загрузки у меня есть следующие файлы, которые я хотел бы переименовать:

Original Name                   Renamed Filename
wcm14444.csv.11.10.20_09.32     wcm14444_111020_0932.csv
wcm14444.csv.11.10.21_00.09     wcm14444_111021_0009.csv
wcm14444.pdf.11.10.20_09.32     wcm14444_111020_0932.pdf
wcm14444.pdf.11.10.21_00.10     wcm14444_111021_0010.pdf
wcm1cash.csv.11.10.21_00.56     wcm1cash_111021_0056.csv
wcm1money.csv.11.10.21_00.56    wcm1money_111021_0056.csv
wcm1opnpos.csv.11.10.21_00.56   wcm1opnpos_111021_0056.csv
wcm1trades.csv.11.10.21_00.56   wcm1trades_111021_0056.csv
wcm1_an.pdf.11.10.21_03.26      wcm1_an_111021_0326.pdf
wcm1_ds.pdf.11.10.21_00.22      wcm1_ds_111021_0022.pdf
wcm1_ep.csv.11.10.21_03.26      wcm1_ep_111021_0326.csv
wcm1_ms.pdf.11.10.21_03.26      wcm1_ms_111021_0326.pdf

Вы заметите в моем требовании переименования: 1. Расширение файла появляется в середине имени файла и помещается в конец. 2. Я заменяю "." с "", где они появляются как разделители даты. Если это поможет, я ожидаю только получения типов файлов (".csv", ".pdf", ".xls"), и там, где они появляются в имени файла, они заменяются на "_".

В настоящее время я бы использовал Excel для выполнения этой задачи, но это кажется довольно сложным для развертывания в качестве системной задачи? Это кажется более сложной задачей для Powershell.

Если я создаю папки ГГГГММДД, например, N: \ SFTP \ Provider1 \ ГГГГММДД, каким будет наилучший способ автоматизации переименования файлов, когда файлы загружаются в ГГГГМД каждого дня (учитывая, что в те же дни может не быть папкой, созданной, потому что нет новых файлов). Большое спасибо и всего наилучшего, Берти.


Спасибо всем за помощь. Больше для тех, кто спотыкается на этой странице. Теперь я создал файл Rename_SFTP.ps1 в N: \ SFTP \ Provider1 \, содержащий

$pattern = '^([^\.]+)\.(csv|xls|pdf)\.(\d{2})\.(\d{2})\.(\d{2})_(\d{2})\.(\d{2})'
$todayDate = Get-Date -Format "yyyyMMdd"

Get-ChildItem (".\" + $todayDate + "\") -Recurse | Foreach-Object{
    if($_.Name -match $pattern)
    {
        echo $NewName
        $NewName = "{0}_{1}{2}{3}_{4}{5}.{6}" -f $matches[1],$matches[3],$matches[4],$matches[5],$matches[6],$matches[7],$matches[2]
        Rename-Item (".\" + $todayDate + "\" + $_) -NewName $NewName
    }
}

Затем я создал RunRenameTaskForToday.bat, содержащий

powershell .\Rename_SFTP.ps1

По крайней мере, таким образом, когда я загружаю файлы вручную, все, что мне нужно сделать, - это дважды щелкнуть по файлу .bat на уровень выше, и он покажет нужную папку, в которую необходимо переименовать файлы. Все, что мне нужно сделать, это найти способ автономно загружать SFTP-файлы ...

Спасибо всем.

Ответы [ 3 ]

2 голосов
/ 21 октября 2011

Здесь довольно сложная задача, с несколькими проблемами (и, скорее всего, несколькими решениями). Вот несколько рекомендаций, которые помогут вам:

  • Используйте Get-ChildItem | Foreach-Item для обхода всех файлов. $_ содержит текущий элемент.
  • Powershell имеет очень хорошую поддержку регулярных выражений , используйте if ($_ -match "regexp"). Я склонен называть спички, чтобы легче их идентифицировать. Примерно так может работать для вашего конкретного формата именования:

    if ($s -match "(?<pre>.*)\.(?<ext>csv|pdf)(?<date>.*)_(?<hour>\d{2})\.(?<min>\d{2})") { $newname = $matches["pre"] + "_" + ($matches["date"] -replace "\.","") + "_" + $matches["hour"] + $matches["min"] + '.' + $matches["ext"] }

  • Чтобы получить текущий день, используйте Get-Date -Format "yyyyMMdd". Используйте это для создания новой папки каждый день.

1 голос
/ 21 октября 2011

Вот еще один способ использования строки формата для создания нового имени. Каждая группа символов шаблона, заключенная в круглые скобки, обозначает часть имени файла, которая должна быть захвачена, и используется позже в $ NewName для формирования нового имени файла:

$pattern = '^([^\.]+)\.(csv|xls|pdf)\.(\d{2})\.(\d{2})\.(\d{2})_(\d{2})\.(\d{2})'


Get-ChildItem D:\temp -Recurse | Foreach-Object{
    if($_.Name -match $pattern)
    {
        $NewName = "{0}_{1}{2}{3}_{4}{5}.{6}" -f $matches[1],$matches[3],$matches[4],$matches[5],$matches[6],$matches[7],$matches[2]
        Rename-Item $_ -NewName $NewName
    }
}
1 голос
/ 21 октября 2011

Ну, быстро, что называется бриколаж ...

$ext = ("csv", "pdf", "xls")

foreach ($e in $ext)
{    
  Get-ChildItem "*$e*" | % {$newName = $_.name.replace('.',''); $newName;
                            Rename-Item $_.fullname -NewName ($newName -replace "(.*)($e)(.*)",'$1_$3.$2')}
}
...