Скопируйте первый файл изображения из подпапок в родительский и переименуйте - PullRequest
2 голосов
/ 07 октября 2019

Внутри определенной папки у меня есть несколько подпапок, в каждой из которых хранятся файлы изображений.

Я хотел бы скопировать первый файл изображения из каждой подпапки в родительский и переименовать его вимя папки, к которой она принадлежит.

Мне удалось написать следующий скрипт с информацией из нескольких других вопросов на сайте, но есть кое-что, что работает не так, как ожидалось. Запуск сценария не копирует / не переименовывает файл.

$Root = (Get-Item -Path '.\' -Verbose).FullName                                        #'

$Folders = Get-ChildItem -Path $Root -Directory

$Image = Get-ChildItem -Name -Filter *.* | Select-Object -First 1

Foreach($Fld in $Folders)
{
    Copy-Item -Path "$($Fld.FullName)\$Image" -Destination "$Root\$($Fld.Name).jpeg"
}

Read-Host -Prompt "Press Enter to exit"

Я хочу иметь возможность запускать сценарий из любой папки, пути должны быть относительными, а не абсолютными / жестко закодированными. Я думаю, что переменная $Root достигает этой цели.

Подпапки содержат только файлы изображений, фильтр *.* в $Image Get-ChildItem подходит для этой цели, так как он всегда выбираетобраз. Однако команда Copy-Item скопирует его с расширением jpeg, возможно ли проверить расширение файла изображения и соответственно скопировать / переименовать? Возможно, с некоторыми заявлениями If?

1 Ответ

1 голос
/ 07 октября 2019

Вы по ошибке получаете $image в вашем $root -каталоге, так как вы используете get-childitem без какого-либо параметра -Path. Для вашей цели вам нужно Foreach $Fld (папка) отдельно:

$Root = (Get-Item -Path '.\' -Verbose).FullName                                        #'

$Folders = Get-ChildItem -Path $Root -Directory

Foreach($Fld in $Folders)
{
    $Image = Get-ChildItem -Path $Fld -Name -Filter *.* | Select-Object -First 1

    Copy-Item -Path "$($Fld.FullName)\$Image" -Destination "$Root\$($Fld.Name).jpeg"
}

Read-Host -Prompt "Press Enter to exit"

Вот вам код, немного сокращенный:

$Folders = Get-ChildItem -Directory # Without -path you are in the current working directory

Foreach($Fld in $Folders)
{
    $Image = Get-ChildItem -Path $Fld -Filter *.* | Select-Object -First 1    # Without the -name you get the whole fileinfo

    Copy-Item -Path $Image.FullName -Destination "$PWD\$($Fld.Name)$($Image.Extension)"    # $PWD is a systemvariable for the current working directory
}

Read-Host -Prompt "Press Enter to exit"

Вы можете быть еще более смелым в качестве FullNameпапки содержит путь:

Copy-Item -Path $Image.FullName -Destination "$($Fld.FullName)$($Image.Extension)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...