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

461
bobkush

Следующий скрипт 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  
1
Что вы имеете в виду под "OUTSIDE"? LotPings 6 лет назад 0
Вы не показываете полный сценарий. Gerard H. Pille 6 лет назад 0
Джеральд - Я показываю полный сценарий - что вы видите, отсутствует? bobkush 6 лет назад 0
Я вижу команды разрыва. Они предназначены для выхода из цикла, но не находятся внутри цикла. Я вижу переменную $ Recursive, которая никогда не устанавливается. Gerard H. Pille 6 лет назад 0

2 ответа на вопрос

1
Gerard H. Pille

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

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

Если я правильно понимаю, измененные изображения должны быть размещены, $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 *,@} }   # 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.

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