1

Надеюсь, кто-нибудь может помочь мне здесь. Мне нужно регулярно чистить некоторые данные, но если не делать это вручную, я не нашел хорошего решения.

Вот поток, который я прохожу вручную.

У меня есть папка верхнего уровня под названием "Данные", под ней у меня есть несколько папок, около 100, которые приходят и уходят. Под каждым из них есть файл с именем folder.jpg. В этом каталоге также есть подпапки, но мне нужно, чтобы они остановились на корневом уровне.

В идеале, он будет выполнять поиск по каждой папке и смотреть, есть ли там файл с именем show.jpg, игнорировать ли папку и двигаться дальше. Если нет, найдите в той же папке файл с именем folder.jpg и скопируйте его в новый файл с именем show.jpg.

Звучит легко в моей голове.

1 ответ1

2

Вот скрипт, который должен работать в 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 если хотите.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .