2016-04-06 4 views
2

У меня есть куча папок, которые мне нужно изменить следующим образом:переименовывать папки, чтобы соответствовать имени файла внутри

перед:

  • FolderNamedX (2016)
    • fileNamedY.png

после:

  • NamedSameAsFileWithin (2016)

    • fileNamedY.png

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

Я пытаюсь сделать это с помощью PowerShell. Любая душа может направить меня в правильном направлении?

Я новичок в PowerShell и до сих пор у меня есть что-то вроде этого (не смейтесь слишком сильно):

Get-ChildItem -Path "C:\Lab" | ForEach-Object -Process { 
    $Filename = Filename.Trim(".png") # Not sure how to retrieve the filename from current folder 
    $OldFolderName = $_.Name 
    $NewFolderNameLeft, $NewFolderNameRight = $OldFolderName.Split("(") 
    $NewFolderNameLeft = $Filename 
    Rename-item -Path $_.Name -NewName ($NewFolderNameLeft+"("+$NewFolderNameRight) -WhatIf 
} 
+0

Благодарим за показ вашей работы. Здесь идет долгий путь. – Matt

+0

Является ли всегда последним персонажем, который меняется до года? В папках есть только один png? – Matt

+0

Ваш код изменяет папку в соответствии с файлом внутри. Ваш пример просто меняет один символ. Что он? – Matt

ответ

2

Havent имел возможность протестировать еще, но это должно работать. Оставляя -whatif, и у вас уже есть среда для тестирования.

Get-ChildItem -Path "C:\Lab" | Where-Object{$_.PSisContainer} | ForEach-Object -Process { 
    # Get the filename without the extension 
    $pngName = Get-ChildItem $_ -Filter "*.png" | Select-Object -ExpandProperty BaseName 
    Rename-Item -Path $_.FullName -NewName ($_.Name -replace ".*\(","$pngName (") -WhatIf 
} 

Получить каждую папку под дорогой. Затем для каждой из этих папок возвращается базовое имя PNG внутри. Используйте это, чтобы заменить все перед открытыми скобками. A very Простое регулярное выражение гарантирует это. Возможно, это плохо, если в них есть папки без png, поэтому вам нужно быть осторожными и, возможно, строить в какой-то логике, чтобы учесть это.

+0

Спасибо ОЧЕНЬ много. Теперь я собираюсь попробовать и переварить его полностью, так как это много над моей головой. – Norskyi

+0

Мне дана ошибка: Неверный шаблон регулярных выражений:. * (. Попытка выяснить это.Забавно, что я начал читать о regex сегодня – Norskyi

+0

@Norskyi Это, вероятно, опечатка в скрипте @ Matt, где '(' является специальным символом в регулярном выражении, поэтому, если вы хотите совместить их с шаблоном, их нужно экранировать с помощью '\' перед ними, как '\ ('. В противном случае они идут в парах '()' и дают инструкции движку regex о том, как группировать разные биты текста вместе. – TessellatingHeckler

1
# Process all the subdirectories in d:\test 
# (ignore any files) 
Get-ChildItem -Directory "d:\test\" | ForEach { 

    # Get the .png files in each directory; get the first file 
    # (so it doesn't break if there's more than one) 
    $fileName = Get-ChildItem $_ -File -Name *.png | Select -First 1 

    # Rename the directory with a regular expression pattern 
    # which puts in the file's BaseName (name with no extension). 
    # 
    # The regular expression matches anything up to the first " (" 
    # i.e. everything before " (2016)" gets replaced, but that is kept. 
    # 
    Rename-Item $_ -NewName ($_.Name -replace '.*(?= \()', $fileName.BaseName) 

} 

Только слегка проверенный.

+0

Большое спасибо sir. Дайте ему a назад – Norskyi

+1

Вам нужно указать png, поскольку в этом каталоге есть другие файлы и что для этого кода требуется PowerShell 3.0. Я хотел сделать позитивный просмотр, но пытался сохранить регулярное выражение. Хорошая работа – Matt

+0

Отредактировано – TessellatingHeckler