Создайте папку с именем файла, которое имеет 2 подчеркивания, затем поместите этот файл в папку - PullRequest
2 голосов
/ 04 марта 2020

Я пытаюсь создать папку с помощью PowerShell для следующих файлов

4_2017-07-16_01-22-52.mp4
4_2017-07-16_01-23-50.mp4
4_2017-07-16_01-24-54.mp4
4_2017-07-16_01-26-21.mp4

Я использую этот метод

{ ссылка }

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

4_2017-07-16 или каталог, как 4_2017_07_16

это первый метод.

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

2017, затем подкаталог 02, затем подкаталог 16, затем подкаталог 4, затем переместите файлы в подкаталог 4

так будет следующим образом

2017
--------07
------------16
---------------------04 ----> files will be here 

Вы можете помочь с этими двумя методами?

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Для первого метода (одна целевая папка с именем, например 4_2017_07_16) вы можете сделать:

$source      = 'D:\Mp4Files'  # rootfolder where the files are
$destination = 'D:\Test'      # rootfolder where the files need to go
Get-ChildItem -Path $source -File -Filter '*.mp4' |
  Group-Object { ($_.BaseName -replace'(\d+_[^_]+).*', '$1') } |
  ForEach-Object {
    $targetFolder = Join-Path -Path $destination -ChildPath $_.Name
    # create this folder if it does not already exist
    if (!(Test-Path -Path $targetFolder -PathType Container)) {
        $null = New-Item -Path $targetFolder -ItemType Directory
    }
    $_.Group | Move-Item -Destination $targetFolder
}

Результат:

D:\TEST\4_2017-07-16
    4_2017-07-16_01-22-52.mp4
    4_2017-07-16_01-23-50.mp4
    4_2017-07-16_01-24-54.mp4
    4_2017-07-16_01-26-21.mp4

Второй метод создает больше подпапок, основываясь на первой части имен файлов:

$source      = 'D:\Mp4Files'
$destination = 'D:\Test'
Get-ChildItem -Path $source -File -Filter '*.mp4' |
  Group-Object { ($_.BaseName -replace'(\d+_[^_]+).*', '$1') } |
  ForEach-Object {
    $index, $year, $month, $day = $_.Name -split '[-_]'
    $targetFolder = Join-Path -Path $destination -ChildPath ('{0}\{1:00}\{2:00}\{3:00}' -f $year, [int]$month, [int]$day, [int]$index)
    # create this folder if it does not already exist
    if (!(Test-Path -Path $targetFolder -PathType Container)) {
        $null = New-Item -Path $targetFolder -ItemType Directory
    }
    $_.Group | Move-Item -Destination $targetFolder
}

Результат:

D:\TEST\2017
\---07
    \---16
        \---04
                4_2017-07-16_01-22-52.mp4
                4_2017-07-16_01-23-50.mp4
                4_2017-07-16_01-24-54.mp4
                4_2017-07-16_01-26-21.mp4
1 голос
/ 04 марта 2020

Вы можете попробовать что-то вроде этого:

$folder = 'FILES_FOLDER'

Get-ChildItem -Path $folder | ForEach-Object {
    $subFolders = $_.Name.Split("-_")
    $path = Get-Location
    $order = 1, 2, 3, 0

    $order | ForEach-Object {
        $path = Join-Path -Path $path -ChildPath $subFolders[$_]

        if (-not (Test-Path -Path $path -PathType Container)){
            New-Item -Path $path -ItemType Directory
        }
    }

    Move-Item -Path $_.FullName -Destination $path
}

, который переместит все файлы в:

2017/07/16/4/4_2017-07-16_01-22-52.mp4
2017/07/16/4/4_2017-07-16_01-23-50.mp4
2017/07/16/4/4_2017-07-16_01-24-54.mp4
2017/07/16/4/4_2017-07-16_01-26-21.mp4

Объяснение:

  • Разделить файлы на "-" и "_" с Split. Можно посмотреть about_split для получения дополнительной информации.
  • Получить текущий путь к папке с помощью Get-Location, который используется для добавления к текущему пути для создания подпрограммы каталоги.
  • Создайте массив $order, чтобы создать правильный порядок подпапок, как показано в вопросе.
  • Итерация по этому массиву $order и создание новых каталогов, если они не существуют. Можно использовать Test-Path, чтобы проверить, существуют ли подпапки, и New-Item, чтобы создать новый каталог.
  • Переместить файлы в конечный подпапку с помощью Move-Item. Эти подкаталоги будут в вашем текущем рабочем каталоге. Очевидно, вы можете изменить это в другое место каталога.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...