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

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

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

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

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/ за первоначальный сценарий.)

🤔 А знаете ли вы, что...
С помощью PowerShell можно аудитить и мониторить действия пользователей в системе.


3
50
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'"
    }
}

Интересные вопросы для изучения