Перемещение изображений в подпапках в зависимости от ориентации

У меня есть следующий скрипт, который перемещает изображения портретной ориентации в подпапку с именем «портрет».

Он работает отлично, но только если скрипт находится и выполняется из той же папки, что и изображения. Это означает, что мне придется скопировать скрипт во все мои папки и запускать его по одному разу для каждой папки (больно!).

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

Folder (script is here)
SubFolder1 (images are here)
SubFolder2 (images are here)
SubFolder3 (images are here)

And results in:

Folder
SubFolder1\portrait (portrait images are moved here)
SubFolder2\portrait (portrait images are moved here)
SubFolder3\portrait (portrait images are moved here)

Скрипт:

Add-Type -AssemblyName System.Drawing

$ImageList = Get-ChildItem "*.jp*g"
$LandscapePath = ""
$PortraitPath = "portrait"

md portrait

Foreach($ImageFile in $ImageList)
{
    #Get the image information
    $image = New-Object System.Drawing.Bitmap $ImageFile.Fullname
    #Get the image attributes
    $ImageHeight = $image.Height
    $ImageWidth = $image.Width
    #Close the image
    $image.Dispose()
    If($ImageWidth -lt $ImageHeight)
    {
        Move-Item -LiteralPath $ImageFile.FullName -Destination $PortraitPath -Force
    }
}

Я пытался

$ImageList = Get-ChildItem "*.jp*g" -Recurse

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

Спасибо

(Спасибо https://powershelladministrator.com/2021/09/20/move-images-based-on-dimension/ за первоначальный сценарий.)

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете переместить логику для создания каталога portrait внутри цикла, затем вы можете добавить -Recurse к Get-ChildItem для обхода всех дочерних каталогов, а внутри цикла вы можете присоединиться к свойству .DirectoryName файла (получает абсолютный путь к родительскому файлу). каталог) с помощью portrait, чтобы создать путь назначения для каждого файла:

Add-Type -AssemblyName System.Drawing

$jpgs = Get-ChildItem -Filter '*.jp*g' -Recurse
$jpgs | ForEach-Object {
    try {
        $image = [System.Drawing.Bitmap]::new($_.FullName)
        $shouldMove = $image.Width -lt $image.Height
    }
    finally {
        if ($image) {
            $image.Dispose()
        }
    }

    if ($shouldMove) {
        # join the jpg parent directory path with `portrait`
        $portraitPath = Join-Path $_.DirectoryName -ChildPath portrait
        # if the folder doesnt exist
        if (-not (Test-Path $portraitPath)) {
            # create it
            $null = New-Item $portraitPath -ItemType Directory
        }

        # move it to new dir
        $_ | Move-Item -Destination $portraitPath -Force
        Write-Host "Moving '$($_.FullName)' to '$portraitPath'"
    }
}

Спасибо за ваш ответ, я попробовал этот код, и все, что он делает, это создает подпапку портрета в том же каталоге, что и скрипт...

Mister Nobody 26.08.2024 19:03

@MisterNobody ты уверен, что пытаешься ответить именно на этот ответ? Я удалил и обновил свой предыдущий ответ

Santiago Squarzon 26.08.2024 19:06

Да, сэр, я точно скопировал. Только что попробовал еще раз, такое же поведение.

Mister Nobody 26.08.2024 19:10

@MisterNobody извиняюсь, попробуйте эту новую версию. Только что проверил, теперь должно работать

Santiago Squarzon 26.08.2024 19:22

Ваша доработка работает! Спасибо! 👍

Mister Nobody 26.08.2024 19:26

@MisterNobody рад, что помогло :)

Santiago Squarzon 26.08.2024 19:27

Ну, я не уверен в деталях корпуса, но заказ по ширине/высоте не дает полной гарантии относительно ориентации, в которой было сделано изображение. Нет, или я что-то упускаю?

Civette 27.08.2024 10:06

Другие вопросы по теме