Переименование диапазона из файлов с Powershell - с первого на третье с последнего дефиса - PullRequest
0 голосов
/ 19 октября 2018

У меня есть несколько CSV-файлов, которые я хотел бы переименовать с PowerShell.

с

abc-def-ghi-jkl-mno-pqr-ke-traffic-by-domains-17-Oct-2018_23-49-38-6d73395f476ad09a7506dc00533933b8.csv
abc-def-ghi-jkl-mno-pqr-ke-traffic-by-domains-15-Oct-2018_05-20-36-75eabae7c4123198ff5fe6f4f642449f.csv
abc-def-ghi-jkl-mno-pqr-ke-traffic-by-domains-12-Oct-2018_06-23-58-b13eb8f362c09fbe405458fac8af8f8e.csv

до

abc-17-Oct-2018.csv
abc-15-Oct-2018.csv
abc-12-Oct-2018.csv

Я могу удалить символы послеподчеркивание (_) с этой командой

Get-ChildItem -Filter *.csv | Foreach-Object -Process { 
    $NewName = [Regex]::Match($_.Name,"^[^_]*").Value + '.csv'
    $_ | Rename-Item -NewName $NewName}

, которое приводит меня к этому имени файла

abc-def-ghi-jkl-mno-pqr-ke-traffic-by-domains-17-Oct-2018.csv

, но я теряюсь при удалении диапазона символов от первого дефиса до третьегос последнего дефиса.

Я пробовал это, но получаю ошибку.

Get-ChildItem -Filter *.csv | Rename-Item -NewName { 
-replace '^[^-]..^[^-]{-3}','^[^-]'}

Может ли кто-нибудь любезно просветить меня, как стереть диапазон?(и, возможно, объединить предыдущую команду)

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Предполагая, что все входные имена файлов имеют одинаковое количество токенов с одинаковыми разделителями в одинаковых позициях:

Get-ChildItem -Filter *.csv | Rename-Item -NewName { 
  (($_.Name -split '[-_]')[0, 10, 11, 12] -join '-') + '.csv' 
} -WhatIf

-WhatIf предварительный просмотр операций переименования;удалите его для фактического переименования.

Разделение имени файла на токены с помощью разделителей позволяет избежать сложных регулярных выражений;Гибкая нарезка массивов в PowerShell позволяет легко собрать целевое имя файла из токенов, к которым обращаются его индексы.


Тем не менее, если вы хотите сделать это с -replace и сложным регулярным выражением:

Get-ChildItem -Filter *.csv | Rename-Item -NewName { 
  $_.Name -replace '^([^-]+).*?-(\d[^_]+).*', '$1-$2.csv' 
} -Whatif

Это решение не предполагает фиксированной позиции 2-го токена для извлечения - того, что перед _ - и вместо этого определяет его начало с помощью -, за которым следует цифра (\d).

0 голосов
/ 19 октября 2018

Как насчет извлечь только то, что нужно для переименования.Смысл Что я проверял.RegEx перехватывает первые 4, дату и последний 4. Как я проверял этот подход.

Clear-Host

Write-Host "`nCreate the the file set *********" -ForegroundColor Cyan

'abc-def-ghi-jkl-mno-pqr-ke-traffic-by-domains-17-Oct-2018_23-49-38-6d73395f476ad09a7506dc00533933b8.csv',
'abc-def-ghi-jkl-mno-pqr-ke-traffic-by-domains-15-Oct-2018_05-20-36-75eabae7c4123198ff5fe6f4f642449f.csv',
'abc-def-ghi-jkl-mno-pqr-ke-traffic-by-domains-12-Oct-2018_06-23-58-b13eb8f362c09fbe405458fac8af8f8e.csv' | 
%{New-Item -Path 'D:\Temp' -Name $_ -ItemType File}

Write-Host "`nValidate the file set creation *********" -ForegroundColor Cyan

(Get-ChildItem -Path 'D:\Temp' -Filter 'abc*').FullName


Write-Host "`nRead the folder for the file set and rename based on regex to shorten the name *********" -ForegroundColor Cyan

Get-ChildItem -Path 'D:\Temp' -Filter 'abc*' | 
%{ Rename-Item -Path $_.FullName -NewName  ([regex]::Matches($_.Name,'^.{0,4}|\d{2}.*\-\d{4}|.{4}$').Value -join '')}


Write-Host "`nValidate the name change *********" -ForegroundColor Cyan

(Get-ChildItem -Path 'D:\Temp' -Filter 'abc*').FullName

# Results

Create the the file set *********


    Directory: D:\Temp


Mode                LastWriteTime         Length Name                                                                                                                                               
----                -------------         ------ ----                                                                                                                                               
-a----       10/18/2018   9:29 PM              0 abc-def-ghi-jkl-mno-pqr-ke-traffic-by-domains-17-Oct-2018_23-49-38-6d73395f476ad09a7506dc00533933b8.csv                                            
-a----       10/18/2018   9:29 PM              0 abc-def-ghi-jkl-mno-pqr-ke-traffic-by-domains-15-Oct-2018_05-20-36-75eabae7c4123198ff5fe6f4f642449f.csv                                            
-a----       10/18/2018   9:29 PM              0 abc-def-ghi-jkl-mno-pqr-ke-traffic-by-domains-12-Oct-2018_06-23-58-b13eb8f362c09fbe405458fac8af8f8e.csv                                            

Validate the file set creation *********

D:\Temp\abc-def-ghi-jkl-mno-pqr-ke-traffic-by-domains-12-Oct-2018_06-23-58-b13eb8f362c09fbe405458fac8af8f8e.csv
D:\Temp\abc-def-ghi-jkl-mno-pqr-ke-traffic-by-domains-15-Oct-2018_05-20-36-75eabae7c4123198ff5fe6f4f642449f.csv
D:\Temp\abc-def-ghi-jkl-mno-pqr-ke-traffic-by-domains-17-Oct-2018_23-49-38-6d73395f476ad09a7506dc00533933b8.csv

Read the folder for the file set and rename based on regex to shorten the name *********

Validate the name change *********

D:\Temp\abc-12-Oct-2018.csv
D:\Temp\abc-15-Oct-2018.csv
D:\Temp\abc-17-Oct-2018.csv
0 голосов
/ 19 октября 2018

Итак, я нашел очень длинный и запутанный способ сделать это, но он работает так, что работает.

# Adds files into an object
$CSV = Get-ChildItem "C:\temp\test\*.csv" 

# Create a loop to action each file in the object created above
Foreach($File in $CSV){
    # Splits each part of the filename using the hyphen
    $NewName = @($File.basename.Split('-'))
    # created a new name using each individual part of the split original name
    # Also replaced the underscore section
    $NewFileName = "$($NewName[0])"+"-"+"$($NewName[10])"+"-"+"$($NewName[11])"+"-"+"$($NewName[12] -replace '_.*')"+".csv"
    # Renames file
    Rename-Item $File $NewFileName
}
...