Пакетное переименование и копирование нескольких файлов в Windows

У меня есть большое количество файлов с такими именами в одной папке:

  • myPic_fr.png
  • myPic_it.png
  • myPic_gr.png

Я хочу переименовать их в:

  • myPic_fr_1080.png
  • myPic_it_1080.png
  • myPic_gr_1080.png

Затем скопируйте их в новую папку следующим образом:

  • ../fr/myPic_fr_1080.png
  • ../it/myPic_it_1080.png
  • ../gr/myPic_gr_1080.png

Как создать пакетный скрипт или скрипт powershell для выполнения этой работы?

Изменить: я попробовал этот код пакетного сценария для выполнения задания по переименованию (Спасибо, @RoXX):

@echo off
setlocal EnableDelayedExpansion
SET oldPart=.png
SET newPart=_1080.png
for /f "tokens=*" %%f in ('dir /b *.png') do (
  SET newname=%%f
  SET newname=!newname:%oldPart%=%newPart%!
  move "%%f" "!newname!"
)

Но для части «копировать» я не знаю, как это сделать! Может быть, нужен Regex?

Спасибо


person Wadjey    schedule 11.10.2018    source источник
comment
Вам нужно переименовать их только в папке назначения или в обоих местах?   -  person Mathias R. Jessen    schedule 11.10.2018
comment
Я бы попробовал сначала прочитать документацию: Get -ChildItem, Copy-Item & Rename-Item а затем попробуйте написать код самостоятельно. Если/когда вы столкнетесь с какими-либо проблемами с вашим кодом, объясните, что вы пробовали и почему это не сработало для вас.   -  person James C.    schedule 11.10.2018
comment
в обоих местах.   -  person Wadjey    schedule 11.10.2018
comment
Вы слишком сильно закодировали пакетный файл. Прочтите последний раздел файла справки для команды FOR. Очень легко удалить расширение файла из имени файла без замены строки.   -  person Squashman    schedule 11.10.2018


Ответы (3)


Образец дерева до

> tree /f
    myPic_fr.png
    myPic_gr.png
    myPic_it.png

запуск этого скрипта:

## Q:\Test\2018\10\11\SO_52760856.ps1
Get-ChildItem *_*.png | Where-Object BaseName -match '^.*_([^_]{2})$' | 
  ForEach-Object {
    $Country=$Matches[1]
    $NewName=$_.BaseName+"_1080"+$_.Extension
    $_ | Rename-Item -NewName $NewName
    if (!(Test-Path $Country)){MD $Country|Out-Null}
    Copy-Item  $NewName (Join-Path $Country $newName)  
  }

и дерево после

> tree /f
│   myPic_fr_1080.png
│   myPic_gr_1080.png
│   myPic_it_1080.png
│
├───fr
│       myPic_fr_1080.png
│
├───gr
│       myPic_gr_1080.png
│
└───it
        myPic_it_1080.png
person Community    schedule 11.10.2018
comment
Большое спасибо @lotpings ???? Еще один момент, как сопоставить имя файла в этом формате myPic_02_fr.png ? - person Wadjey; 11.10.2018
comment
Чтобы избежать проблем при многократном запуске скрипта, я выбрал регулярное выражение для выбора страны, которая ожидает только один символ подчеркивания. Способ использования @Esperento57 позволяет избежать этого, выбирая последний токен с разделителем подчеркивания. Я изменю свое регулярное выражение, чтобы оно не определяло количество знаков подчеркивания за .минуту - ГОТОВО - person ; 11.10.2018
comment
Идеально! Еще раз спасибо ???? - person Wadjey; 11.10.2018

Это далеко не оптимально, но вы можете попробовать что-то вроде этого:

foreach ($pic in (Get-ChildItem *.png -Name)) {
    # delete "myPic_" and ".png" to get the destination-folder from the filename
    $destFolder = ($pic -replace "myPic_", "") -replace "`.png", ""
    # replace ".png" with "_1080.png" to create the new filename
    $destName = $pic -replace ".png", "_1080.png"

    Copy-Item "$pic" "$destFolder\$destName"
}
person Razorfen    schedule 11.10.2018

попробуй это

Get-ChildItem "C:\temp\test" -file -Filter "?*_?*.png" | %{

$NewName="{0}_1080{1}" -f $_.BaseName, $_.Extension
$NewDir="{0}\{1}" -f $_.DirectoryName, ($_.BaseName -split "_")[-1]
$NewPath="{0}\{1}" -f $NewDir, $NewName

New-Item $NewDir -ItemType Directory -Force
Copy-Item $_.FullName -Destination $NewPath -Force -Recurse
Rename-Item $_.FullName -NewName $NewName
}
person Esperento57    schedule 11.10.2018