У меня есть следующий скрипт, который перемещает изображения портретной ориентации в подпапку с именем «портрет».
Он работает отлично, но только если скрипт находится и выполняется из той же папки, что и изображения. Это означает, что мне придется скопировать скрипт во все мои папки и запускать его по одному разу для каждой папки (больно!).
Как я могу изменить сценарий, чтобы его можно было найти и выполнить из родительской папки, а также рекурсивно использовать любые подпапки изображений, такие как:
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/ за первоначальный сценарий.)
Вы можете переместить логику для создания каталога 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'"
}
}
@MisterNobody ты уверен, что пытаешься ответить именно на этот ответ? Я удалил и обновил свой предыдущий ответ
Да, сэр, я точно скопировал. Только что попробовал еще раз, такое же поведение.
@MisterNobody извиняюсь, попробуйте эту новую версию. Только что проверил, теперь должно работать
Ваша доработка работает! Спасибо! 👍
@MisterNobody рад, что помогло :)
Ну, я не уверен в деталях корпуса, но заказ по ширине/высоте не дает полной гарантии относительно ориентации, в которой было сделано изображение. Нет, или я что-то упускаю?
Спасибо за ваш ответ, я попробовал этот код, и все, что он делает, это создает подпапку портрета в том же каталоге, что и скрипт...