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

Компьютерный форум 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:
Если нужно копировать 50, тогда указываем в параметре 49? »
Причём тут параметр? Мы не можем управлять его содержимым по определению. Мы используем оператор «больше или равно»:
Код: Выделить весь код
… -ge 50)
Цитата rengaboy:
Тут вылезла другая проблема. Я про нее совершенно забыл. Файлы лежат в подпапках структуры типа год\месяц\число. И надо делать рекурсивный поиск. »
Сделали рекурсивный поиск. Копируем найденное и подходящее по условию в каталог Alert, находящийся/создаваемый в текущем каталоге. Очередные найденные и отобранные по условию имена файлов совпали с уже находящимися в Alert. И что делать? Видите, как легко попасть впросак с непродуманным в голове в деталях подходом на авось.

Цитата rengaboy:
Попробовал изменить на Get-ChildItem -Path "$sSourceFolder" -Include *.xml -Recurse, но что-то не выходит каменный цветок. »
Просто добавить параметр «-Recurse» к командлету:
Код: Выделить весь код
Get-ChildItem -Path "$sSourceFolder\*.xml" -Recurse
Цитата rengaboy:
Все копирует, но вылезает ошибка Copy-Item : Не удается скопировать элемент E:\nucmonarchive\Alert\d530f6c2d0a9b319809e8c022b69bccf.xml в самого себя. И далее на остальные два файла. »
Вот и ещё один пример непродуманного подхода, когда внезапно™ текущий каталог для скрипта совпадает с исходным каталогом. Естественно, файл нельзя скопировать сам в себя.

Продумайте ещё раз алгоритм работы. И прежде всего — где, что и куда.

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



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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Код: Выделить весь код
$src = 'd:\TEMP\test' # корневой каталог для сканирования
$dst = 'd:\TEMP\alarm' # целевой каталог
$node = 'tTemp' # узел, используемый для фильтрации
dir $src -inc *.xml -rec -file|%{
	$a = @(
	$_.fullname
	$_.directoryname+'\'+$_.basename+'.jpg'
	$_.directoryname+'\'+$_.basename+'.txt'
	)
	if([int](([xml](gc $_.fullname -enc default)).selectnodes("//$node").'#text') -ge 50){
		cp $a $dst -whatif
	}
}
- нет проверки на наличие целевых файлов идентичным исходным (этого нет в условии, видимо уникальные наименования)
-whatif - удалить в боевом режиме

Последний раз редактировалось YuS_2, 29-05-2018 в 14:46.


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


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


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

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


Благодарю за помощь, разнес каталоги. Все работает.

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



Компьютерный форум 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




 
Переход