Вот скрипт, который должен работать в PowerShell, но я еще не тестировал. Это предполагает, что ваша папка данных находится в корне C:.
Get-ChildItem C:\Data\*\* | Where-Object {$_.Name -eq 'folder.jpg'} | ForEach-Object {
$CurrentFolder = $_.Directory
if ((Test-Path "$CurrentFolder\show.jpg") -eq $false)
{Copy-Item $_ "$CurrentFolder\show.jpg"}
Remove-Variable CurrentFolder
}
Сломать:
Параметр, заданный для Get-ChildItem
указывает ему возвращать все объекты, которые отделены от C:\Data на один уровень ниже.
Where-Object
используется для фильтрации этих результатов до файлов с именем folder.jpg.
ForEach-Object
используется для просмотра оставшихся результатов.
Чтобы обработать каждый файл folder.jpg, мы сначала устанавливаем переменную ($CurrentFolder
), которая будет содержать значение пути к папке.
Затем мы используем Test-Path
чтобы увидеть, отсутствует ли show.jpg в той же папке.
Если show.jpg не найден, Copy-Item
скопирует folder.jpg в show.jpg.
Очистка переменной $CurrentFolder
с помощью Remove-Variable
является строго необязательной, но хорошей практикой.
Сценарий также может быть сокращен до этого, если вы ищете «однострочник»:
ls C:\Data\*\*|?{$_.Name -eq 'folder.jpg'}|%{$c=$_.Directory;if(!(Test-Path "$c\show.jpg")){cp $_ "$c\show.jpg"}}
ls
- это встроенный псевдоним для Get-ChildItem
?
является встроенным псевдонимом для Where-Object
%
является встроенным псевдонимом для ForEach-Object
$CurrentFolder
был сокращен до $c
Результат Test-Path "$c\show.jpg"
был отменен (т. Е. TRUE будет FALSE, и наоборот) путем его инкапсуляции в !()
. Если выражение вычисляется непосредственно в логическое значение, и вы хотите, чтобы блок кода выполнялся со значением TRUE, вам не нужно включать -eq $true
в оператор if
.
cp
- это встроенный псевдоним для Copy-Item
Remove-Variable
был опущен. (Хотя вы можете использовать встроенный псевдоним rv
если хотите.)