переместить файлы по именам (переменная последняя буква) в папку - PullRequest
0 голосов
/ 13 февраля 2019

У нас есть система, в которой мы меняем последнюю букву имени файла, если мы делаем новую версию.Мы меняем его по буквам, и сначала О, а затем А, В, С, ... enter image description here

Но более старые версии больше не должны оставаться в этой папке,Я ищу "simpel" решение в powershell для перемещения этих старых файлов в папку "old".

Я не знаю, как запустить в powershell (кроме как перейти в нужную папку) и донне знаю, возможно ли это.Любые предложения могут помочь.

Set-Location -Path "Z:\PDF\2018\18-00190 StBV THV Depret Franki\2D"
Get-ChildItem | Sort-Object -Property name

1 Ответ

0 голосов
/ 13 февраля 2019

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

  1. Сначала сгруппируйте все файлы поих базовое имя файла без суффикса

    Get-ChildItem -File | Group-Object { $_.Basename -creplace '_[A-O](?=$|\.)' }
    

    Это создает ключ группировки, который в основном является именем файла без суффикса last-updated .Затем мы имеем для каждой группы все ревизии, которые были созданы для этого файла.Например, для имен файлов 1409-EM-M-PL-7000_A.dwg.pdf вы получите группу с именем 1409-EM-M-PL-7000.dwg.pdf, содержащую все версии этого файла.

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

  2. Сортировать ревизии по порядку:

    ForEach-Object {
        $_.Group | Sort-Object { $_.Basename -creplace '_O(?=$|\.)', '_0' } -Descending
    }
    

    Мы временно заменим _O на _0 для сортировки здесь, чтобы получитьправильный порядок, поскольку это самый старый , но обычно он отображается как самая последняя версия.

    Мы также сортируем здесь по убыванию (поэтому сначала получаем последние версии), чтобы упростить следующий шаг, посколькуна самом деле мы хотим получить файлы, которые нам нужно переместить, а не те, которые мы хотим сохранить.

  3. Сохраните последние версии n , захватывая каждый файл , кроме последние 3 в этом случае:

    Select-Object -Skip 3
    
  4. Переместите оставшиеся файлы в old:

    Move-Item -Destination old
    

Puttingвсе вместе:

Get-ChildItem -File |
  Group-Object { $_.Basename -creplace '_[A-O](?=$|\.)' } |
  ForEach-Object {
    $_.Group |
      Sort-Object { $_.Basename -creplace '_O(?=$|\.)', '_0' } -Descending |
      Select-Object -Skip 3
  } |
  Move-Item -Destination old

Вставьте -WhatIf на MoveItem, чтобы увидеть, что делается безна самом деле что-то меняет.В качестве примера:

H:\Stuff\54664753> ls

    Directory:  H:\Stuff\54664753

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-----       2019-02-13     10:10        1   old
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_A.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_B.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_C.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_D.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_O.dwg.pdf
-a----       2019-02-13     10:11        0   file2_A.pdf
-a----       2019-02-13     10:11        0   file2_O.pdf
-a----       2019-02-13     10:11        0   file3_O.xml
-a----       2019-02-13     10:11        0   file_A.txt
-a----       2019-02-13     10:11        0   file_B.txt
-a----       2019-02-13     10:11        0   file_C.txt
-a----       2019-02-13     10:11        0   file_O.txt

H:\Stuff\54664753> Get-ChildItem |
>>>   Group-Object { $_.Basename -creplace '_[A-O](?=$|\.)' } |
>>>   ForEach-Object {
>>>     $_.Group |
>>>       Sort-Object { $_.Basename -creplace '_O(?=$|\.)', '_0' } -Descending |
>>>       Select-Object -Skip 2
>>>   } |
>>>   Move-Item -Destination old -Whatif
What if: Performing the operation "Move File" on target "Item: H:\Stuff\54664753\1409-EM-M-PL-7000_B.dwg.pdf Destination: H:\Stuff\54664753\old\1409-EM-M-PL-7000_B.dwg.pdf".
What if: Performing the operation "Move File" on target "Item: H:\Stuff\54664753\1409-EM-M-PL-7000_A.dwg.pdf Destination: H:\Stuff\54664753\old\1409-EM-M-PL-7000_A.dwg.pdf".
What if: Performing the operation "Move File" on target "Item: H:\Stuff\54664753\1409-EM-M-PL-7000_O.dwg.pdf Destination: H:\Stuff\54664753\old\1409-EM-M-PL-7000_O.dwg.pdf".
What if: Performing the operation "Move File" on target "Item: H:\Stuff\54664753\file_A.txt Destination: H:\Stuff\54664753\old\file_A.txt".
What if: Performing the operation "Move File" on target "Item: H:\Stuff\54664753\file_O.txt Destination: H:\Stuff\54664753\old\file_O.txt".

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

H:\Stuff\54664753> Get-ChildItem |
>>>   Group-Object { $_.Basename -creplace '_[A-O](?=$|\.)' }

Count Name                      Group
----- ----                      -----
    1 old                       {old}
    5 1409-EM-M-PL-7000.dwg     {1409-EM-M-PL-7000_A.dwg.pdf, 1409-EM-M-PL-7000_B.dwg.pdf, 1409-EM-M-PL-7000_C.dwg.pdf, 1409-EM-M-PL-7000_D.dwg.pdf...}
    2 file2                     {file2_A.pdf, file2_O.pdf}
    1 file3                     {file3_O.xml}
    4 file                      {file_A.txt, file_B.txt, file_C.txt, file_O.txt}

Или группировку и сортировку, но неотдых:

H:\Stuff\54664753> Get-ChildItem -File |
>>>   Group-Object { $_.Basename -creplace '_[A-O](?=$|\.)' } |
>>>   ForEach-Object {
>>>     $_.Group |
>>>       Sort-Object { $_.Basename -creplace '_O(?=$|\.)', '_0' } -Descending
>>>   }

    Directory:  H:\Stuff\54664753

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_D.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_C.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_B.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_A.dwg.pdf
-a----       2019-02-13     10:02        0   1409-EM-M-PL-7000_O.dwg.pdf
-a----       2019-02-13     10:11        0   file2_A.pdf
-a----       2019-02-13     10:11        0   file2_O.pdf
-a----       2019-02-13     10:11        0   file3_O.xml
-a----       2019-02-13     10:11        0   file_C.txt
-a----       2019-02-13     10:11        0   file_B.txt
-a----       2019-02-13     10:11        0   file_A.txt
-a----       2019-02-13     10:11        0   file_O.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...