Почему этот скрипт Powershell создает преобразованные изображения вне корневой папки?

1

Следующий скрипт Powershell должен обрабатывать все указанные изображения ВНУТРИ указанной корневой папки. Некоторые из переименованных выходных изображений создаются вне корневой папки. Любые гуру Powershell имеют представление, почему? Как вывести файлы только в корневую папку, а не за ее пределы?



# This script requires ImageMagick
# Configuration
# Enter the full path of the folder that contains the images
$Rootfolder = "C:\temp\rktest"


$Recursive=$true
# Change these if necessary
$fileExtensions = "*.png"
$fileNameSuffix = "_resized" # the text to be appended to the output filename to indicate that it has been modified

$files = $null;
$fileCount = 0

# Check if the root folder is a valid folder. If not, try again.
if ((Test-Path $RootFolder -PathType 'Container') -eq $false) {
    Write-Host "'$RootFolder' doesn't seem to be a valid folder. Please try again" -ForegroundColor Red
    break
}

# Get all image files in the folder
if ($Recursive) {
    $files = gci $RootFolder -Filter $fileExtensions -File -Recurse
} 

# If there are no image files found, write out a message and quit
if ($files.Count -lt 1) {
    Write-Host "No image files with extension '$fileExtensions' were found in the folder '$RootFolder'" -ForegroundColor Red
    break
}

# Loop through each of the files and process it
foreach ($image in $files) {
    $newFilename = $image.DirectoryName + " " + $image.BaseName + $fileNameSuffix + $image.Extension
    $imageFullname = $image.FullName

    write-host "Processing image: $imageFullname" -ForegroundColor Green
#This line contains the ImageMagick commands
    & convert.exe $image.FullName -resize 50% $newFilename

    $fileCount++
}

Write-Host "$fileCount images processed" -ForegroundColor Yellow

bobkush
источник
Что вы имеете в виду OUTSIDE?
LotPings
Вы не показываете полный сценарий.
Джерард Х. Пилле
Джеральд - Я показываю полный сценарий - что вы видите, отсутствует?
bobkush
Я вижу команды разрыва. Они предназначены для выхода из цикла, но не находятся внутри цикла. Я вижу переменную $ Recursive, которая никогда не устанавливается.
Джерард Х. Пилле

Ответы:

1

Удалить пробел между каталогом и именем файла, поставить обратную косую черту

$newFilename = $image.DirectoryName + "\" + $image.BaseName + $fileNameSuffix + $image.Extension
Джерард Х. Пилле
источник
Это ИМО вопреки намерению ОП.
LotPings
Джеральд - объясните, пожалуйста, цель обратной косой черты вместо пробела.
bobkush
Цель состоит в том, чтобы поместить файл в каталог, указанный в DirectoryName. Разве вы не знаете значение обратной косой черты, как в "C: \ temp \ rktest" ???
Джерард Х. Пилле
Джеральд - Спасибо за объяснение. Ваше предложение изменить строку newFilename с пробела между каталогом и именем файла на обратную косую черту решило проблему. Теперь скрипт создает все файлы OUTPUT в той же подпапке, что и изображения SOURCE.
bobkush
В таком случае, вы могли бы принять мой ответ?
Джерард Х. Пилле
0

Если я правильно понимаю, измененные изображения должны быть помещены в, $RootFolderно сохранить имена подпапок как часть имени файла, разделенные пробелом.

Следующий скрипт приводит к этому образцу дерева:

> tree /F
C:.
└───temp
    └───rktest
        │   Image.png
        │   Image_resized.png
        │   SubDirL1 Image_resized.png
        │   SubDirL1 SubDirL2 Image_resized.png
        │
        └───SubDirL1
            │   Image.png
            │
            └───SubDirL2
                    Image.png

Создает вычисляемое свойство RelPAthс помощью select, добавляя его в коллекцию $ file.
Для этого сначала удалите RootFolder из FullName и замените все оставшиеся разделители пути \пробелами.

При создании нового имени файла расширение заменяется суффиксом + расширение.

## Q:\Test\2018\06\02\SU_1327985.ps1
# This script requires ImageMagick
# Configuration
# Enter the full path of the folder that contains the images
$Rootfolder = "C:\temp\rktest"

$Recursive=$true
# Change these if necessary
$fileExtensions = "*.png"
$fileNameSuffix = "_resized" # the text to be appended to the output filename to indicate that it has been modified

$files = $null;
$fileCount = 0

# Check if the root folder is a valid folder. If not, try again.
if ((Test-Path $RootFolder -PathType 'Container') -eq $false) {
    Write-Host "'$RootFolder' doesn't seem to be a valid folder. Please try again" -ForegroundColor Red
    break
}

# Get all image files in the folder
if ($Recursive) {
    $files = gci $RootFolder -Filter $fileExtensions -File -Recurse |
      select *,@{n='RelPath';e={ ($_.FullName.Replace($RootFolder+"\",'')).Replace('\',' ') }}
} 

# If there are no image files found, write out a message and quit
if ($files.Count -lt 1) {
    Write-Host "No image files with extension '$fileExtensions' were found in the folder '$RootFolder'" -ForegroundColor Red
    break
}

# Loop through each of the files and process it
foreach ($image in $files) {
    $newFilename = Join-Path $RootFolder ($image.RelPath.Replace($image.Extension,($fileNameSuffix+$image.Extension)))
    write-host "Processing image: $($image.Fullname)" -ForegroundColor Green
    #This line contains the ImageMagick commands
    & magick convert $image.FullName -resize 50% $newFilename

    $fileCount++
}

Write-Host "$fileCount images processed" -ForegroundColor Yellow

Заменен convert.exe magick convertиз-за моей версии ImageMagick.

LotPings
источник
Извините, я не могу следить: поскольку мое дерево примеров показывает, что все файлы в $ RootFolder и в подкаталогах были обработаны. Пока -Recurseпараметр в команде gci присутствует, он должен обрабатывать все подкаталоги.
LotPings
Я даже спросить , что вы имеете в виду с внешней стороны и не получил никакого ответа. Я предположил, что вы намеревались поместить их все в $ RootFolder и содержать имя папки с добавлением имени файла - это то, что код делает сейчас.
LotPings
Не превышать это было бы root. Вы должны были лучше объяснить, где вы хотите их на первом месте.
LotPings
LotPings - Спасибо за ваши инструкции. Ваш скрипт отлично работает для размещения файлов OUTPUT в папке верхнего уровня. Прошу прощения, если мой вопрос затруднил понимание того, что я хотел - но между вами и Джеральдом - у меня теперь есть скрипт, который может создавать ВСЕ выходные файлы в папке TOP, и скрипт, который может создавать ВСЕ выходные файлы в той же подпапке, что и исходные изображения.
bobkush