Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Поиск с созданием списка файлов с последующим их копированием.

Ответить
Настройки темы
PowerShell - Поиск с созданием списка файлов с последующим их копированием.

Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: rengaboy
Дата: 29-05-2018
Доброго времени суток.

Есть много групп файлов в разных папках. Группа состоит из файлов с расширениями jpg, txt, xml. В xml файле есть параметр, по которому файлы надо сортировать в отдельную папку - "<ttemp>nn". "nn" - целое число, если оно меньше 50, файл не трогаем, если больше, копируем его в папку "alert".
На данный момент все решено следующей связкой:
Multiple search and replace - В поиске задаем (\<ttemp\>)([1-9]\d{2,}|[4-9][9-9]), сохраняем результаты в файл result.txt, соответственно в списке только xml файлы с полным путем
Далее в Notepad ++ ищем по файлу "^(.*)(\.xml)" и заменяем на "\1(\.jpg)\r\1(\.txt)\r\1(\.xml)", получаем список всех нужных файлов
Далее запускаем скрипт на PS, который уже эти файлы копирует в нужную папку.

$read = Get-Content .\result.txt
$conv = Out-String -InputObject $read -Stream
ForEach ($Str in $conv){
IF ( Get-ChildItem "$str" | Where-Object { $_.exists -eq "true"})
{Copy-Item "$Str" -destination "H:\alert\"}
else {"Файла не существует"}}

Собственно понимаю, что можно первые два шага тоже перенести в PowerShell, но сам справиться не могу.

Отправлено: 23:38, 28-05-2018

 

Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата rengaboy:
Группа состоит из файлов с расширениями jpg, txt, xml »
Это как понять? Группа состоит из трёх одноимённых файлов с разными расширениями, так? Всегда наличествуют все три файла, обязательно?

Цитата rengaboy:
В xml файле есть параметр, по которому файлы надо сортировать в отдельную папку - "<temp>nn". »
Покажите образцы xml файлов, упакованных в архив. И желательно вместе с одноимёнными «одногруппниками» jpg и txt.

Цитата rengaboy:
файл не трогаем, …, копируем его »
Какой файл не трогаем или копируем, xml? При чём тут тогда упомянутые выше его «одногруппники», с ними что-нибудь делаем?

Цитата rengaboy:
в папку "alert". »
Где она находится, эта папка?

Отправлено: 23:57, 28-05-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
Это как понять? Группа состоит из трёх одноимённых файлов с разными расширениями, так? Всегда наличествуют все три файла, обязательно? »
Именно так. Имена файлов рандомные, наподобие d530f6c2d0a9b319809e8c022b69bccf.xml Всегда наличествуют три файла,обязательно.
Цитата Iska:
Покажите образцы xml файлов, упакованных в архив. И желательно вместе с одноимёнными «одногруппниками» jpg и txt. »
К сожалению показать файлы не могу, так как объект режимный.
jpg- фото с камеры
txt- состояние клапанов и вентилей в текстовом формате
Код: Выделить весь код
sensor ........1-18
sensor ........2-50
sensor ........3-28
bleeder .......1-0
bleeder .......2-0
valve ..........1-0
valve ..........2-1
Состав xml примерно такой:
Код: Выделить весь код
<?xml version="1.0" encoding="windows-1251"?>
	<report>
		<info>

			<nImagePresent>1</nImagePresent>
			<nSize>.......</nSize>
			<nImageWidth>....</nImageWidth>
			<nImageHeight>....</nImageHeight>
			<tChannel>....</tChannel>
			<tTemp>50</tTemp>
			<tSensorName>...........</tSensorName>
			<tLocationCode>..............</tLocationCode>
			<tLatitude>...............</tLatitude>
			<tLongitude>.............</tLongitude>
			<nDatetime>..............</nDatetime>
			<nTZOffset>+3.00</nTZOffset>
Цитата Iska:
Какой файл не трогаем или копируем, xml? При чём тут тогда упомянутые выше его «одногруппники», с ними что-нибудь делаем? »
Не трогаем файлы, если температура меньше, если больше, копируем все три файла в отдельную папку.
Цитата Iska:
Где она находится, эта папка? »
На том же диске, где находится основной архив.

Последний раз редактировалось rengaboy, 29-05-2018 в 01:03.


Отправлено: 00:41, 29-05-2018 | #3


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата rengaboy:
Состав xml примерно такой: »
Примерно не годится, нужно точно. Содержимое внутри (заменённое точками) по сути не важно, важна структура файла.

Цитата rengaboy:
На том же диске, где находится основной архив. »
Где именно? В корневом каталоге раздела, в текущем каталоге, в содержащем скрипт каталоге, в исходном каталоге? Она уже существует или её, возможно, потребуется создавать, если отсутствует?

Отправлено: 01:19, 29-05-2018 | #4


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
Примерно не годится, нужно точно. Содержимое внутри (заменённое точками) по сути не важно, важна структура файла. »
Так это структура и есть. Там еще 15 полей, и в конце закрывашки </info></report>. Температуру мы смотрим в поле <tTemp>50</tTemp>
Цитата Iska:
Где именно? В корневом каталоге раздела, в текущем каталоге, в содержащем скрипт каталоге, в исходном каталоге? Она уже существует или её, возможно, потребуется создавать, если отсутствует? »
Всё равно. Она потом копируется на флешку. Допустим, что в текущем каталоге, уже существует.

Отправлено: 01:29, 29-05-2018 | #5


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Внезапно выяснилось, что кроме «меньше пятидесяти» и «больше пятидесяти»:
Цитата rengaboy:
если оно меньше 50, файл не трогаем, если больше, копируем его в папку "alert". »
существует ещё и «равно пятидесяти». Что делать в этом случае? Я, к сожалению, упустил этот момент изначально.

Вот Вам примерная болванка:
Код: Выделить весь код
$sSourceFolder = 'C:\Мои проекты\0162'

if(Test-Path -Path $sSourceFolder -PathType Container) {
    Get-ChildItem -Path "$sSourceFolder\*.xml" | ForEach-Object -Process {
        if(([xml](Get-Content -Path $_.FullName -Encoding Ascii)).report.info.tTemp -gt 50) {
            $oFolder = New-Item -Path ".\Alert" -ItemType Directory -ErrorAction SilentlyContinue
            Copy-Item -Path $_.FullName, ($_.FullName -replace ".xml$", ".jpg"), ($_.FullName -replace ".xml$", ".txt") -Destination ".\Alert"
        }
    }
} else {
    Write-Host "Can't find source folder [$sSourceFolder]." -ForegroundColor Red
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:34, 29-05-2018 | #6


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
существует ещё и «равно пятидесяти». Что делать в этом случае? Я, к сожалению, упустил этот момент изначально. »
а разве -gt не однозначно "больше"? Если нужно копировать 50, тогда указываем в параметре 49?

Тут вылезла другая проблема. Я про нее совершенно забыл. Файлы лежат в подпапках структуры типа год\месяц\число. И надо делать рекурсивный поиск.

Отправлено: 11:13, 29-05-2018 | #7


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата rengaboy:
а разве -gt не однозначно "больше"? Если нужно копировать 50, тогда указываем в параметре 49? »
А если нужно больше и равно, указываем -ge. Вроде так?

Цитата rengaboy:
Тут вылезла другая проблема. Я про нее совершенно забыл. Файлы лежат в подпапках структуры типа год\месяц\число. И надо делать рекурсивный поиск. »
Попробовал изменить на Get-ChildItem -Path "$sSourceFolder" -Include *.xml -Recurse, но что-то не выходит каменный цветок.

Отправлено: 11:42, 29-05-2018 | #8


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Разобрался, заработало. В объявлении переменной пути надо было слеш добавить в конце. Проглядел.
Все копирует, но вылезает ошибка Copy-Item : Не удается скопировать элемент E:\nucmonarchive\Alert\d530f6c2d0a9b319809e8c022b69bccf.xml в самого себя. И далее на остальные два файла.

Отправлено: 12:38, 29-05-2018 | #9


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


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

однострок:
Код: Выделить весь код
Get-ChildItem -Path E:\nucmonarchive -Filter *.xml -Recurse | Where-Object { [int](Select-Xml -Path $_.FullName -XPath "/report/info/tTemp").Node.'#text' -lt 50 } | Select-Object -ExpandProperty FullName | ForEach-Object { foreach($ext in @('.jpg', '.txt', '.xml')) { $_.Remove($_.Length-4)+$ext }  } |  Copy-Item -Destination E:\Alert

Отправлено: 13:06, 29-05-2018 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Поиск с созданием списка файлов с последующим их копированием.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Нужен батник (архивация самого свежего файла с последующим копированием) shade_art Скриптовые языки администрирования Windows 4 16-09-2016 20:07
Медиа - Мистическая ситуация с копированием аудио файлов в mp3 и неотображением их там Yura-A Microsoft Windows 7 6 25-02-2016 08:10
CMD/BAT - Поиск цифр в текстовом файле и последующий их поиск в названии файлов массива (лог.) antares_80@vk Скриптовые языки администрирования Windows 10 25-10-2015 11:34
Любой язык - Сравнение списка файлов и каталога с файлами с копированием файлов из каталога jastreb83 Скриптовые языки администрирования Windows 0 10-04-2013 09:56
CMD/BAT - [решено] Выбор файлов из списка с последующим копированием и переносом в другую папку yaoleg2 Скриптовые языки администрирования Windows 10 04-11-2011 01:28




 
Переход