Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Сортировка файлов по подстроке (http://forum.oszone.net/showthread.php?t=247780)

kostich 26-11-2012 21:41 2033478

Сортировка файлов по подстроке
 
Доброго времени суток,
нужна помощь в написании скрипта.

Ситуация такая:
в каталог на сервере (к примеру, c:\obmen) выгружаются службой документы в формате: имя_файла.xml + папка с таким же именем и с вложениями.
В файле имя_файла.xml есть строка с адресом (например, <Address=Иванов>).

Нужно написать скрипт, который обходил бы все файлы .xml текущего каталога, искал в них строку с адресом (Иванов, Петров и др. - адрес уникален, количество и имена адресов известны) и, в зависимости от этой строки, перекладывал бы документ (.xml+одноименную папку с вложениями) в нужные подкаталоги (например, c:\obmen\Иванов, c:\obmen\Петров).

Заранее благодарю за оказанную помощь.

Kazun 26-11-2012 23:23 2033528

Пример xml файла можете выложить?

kostich 27-11-2012 10:44 2033741

К сожалению, выложить xml не могу, в них персональные данные и информация по работе компании.
Но как я понимаю, структура xml нас не особо волнует, если мы будем обращаться к нему как к текстовому файлу и искать по подстроке. Здесь можно даже немного упростить задачу:
Найти и переместить все документы (xml + папка с вложениями), где в файле xml встречается слово "Иванов", затем сделать тоже действие с "Петровым" и тд, все остальные (хотя таких не будет) остаются в корневой папке для ручной обработки.

Kazun 27-11-2012 11:06 2033752

Select-String -path *.xml -Pattern "Иванов|Петров" | copy -Destination {$_.matches[0].Value}

kostich 27-11-2012 11:45 2033785

Спасибо, работает!
Копирует xml файлы; а как добавить копирование одноименных папок вместе с xml?

Kazun 27-11-2012 12:02 2033803

copy Иванов,Петров C:\Folder -force -rec

kostich 27-11-2012 12:59 2033831

ммм, немного не то...

выгрузка идет в таком формате:
конфигурационный файл "2bf84f4b-1ac6-4541-aad9-73135f58e9df.xml"
+ папка одноименная "2bf84f4b-1ac6-4541-aad9-73135f58e9df" с вложениями

с копированием .xml Вы мне уже помогли, а вот как вместе с ним одновременно и папку копировать?

Kazun 27-11-2012 13:10 2033843

Код:

Select-String -path *.xml -Pattern "Иванов|Петров" | Foreach {
        $dest = $_.matches[0].Value
        $fpath = $_.Path -replace "\.xml"
        Copy-Item -Path $_.Path -Destionation $dest
        Copy-Item -Path $fpath -Destionation $dest -Recurse -Force
}


kostich 27-11-2012 15:04 2033921

Спасибо большое, теперь все работает как нужно!

Busla 29-11-2012 10:53 2035140

Цитата:

Цитата kostich
Но как я понимаю, структура xml нас не особо волнует, если мы будем обращаться к нему как к текстовому файлу и искать по подстроке. »

Это категорически неправильно!

Особенно в реализации Kazun'а - потому что в папку Иванова попадут обладатели отчеств Иванович, Ивановна и носители фамилий Ивановский и т.п.

Iska 29-11-2012 13:58 2035238

Busla, ну, коллега Kazun тут в общем-то, не при чём — что заказывали, таково было пожелание автора.

kostich 14-12-2012 17:46 2045344

Всем еще раз привет,

хотелось бы домучить этот алгоритм до конца:
проблем с неоднозначной интерпретацией искомого слова не будет (там идут сложные ID, которые не будут пересекаться, Иванов, Петров - это для общего понимания)
но столкнулся с еще одной бедой:
файлы и папки нужно было перемещать, а не копировать.
думал, что можно просто сменить оператор copy на move и будет все отлично, но PS выдал ошибку.
что тут нужно изменить для того, чтобы файлы (и папки) перемещались, а не копировались?
примерно в таком виде это сейчас:
cd C:\obmen
Select-String -path *.xml -Pattern "Иванов|Петров|Сидоров" | Foreach {
$dest = $_.matches[0].Value
$fpath = $_.Path -replace "\.env"
copy-item -Path $_.Path $dest
Copy-Item -Path $fpath $dest -Recurse -Force
}

Kazun 15-12-2012 13:27 2045767

Добавить команду Remove-Item $_.Path и Remove-Item $fpath -Force -Recurse


Время: 18:23.

Время: 18:23.
© OSzone.net 2001-