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

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

Alexander_88 25-08-2019 09:02 2885361

Проверить нужное количество текста в каждом блоке txt файла
 
Здравствуйте. Можно ли проверить нужное количество найденного текста в каждом блоке txt файла с помощью скрипта?
Нужно проверить всю папку с txt файлами.. только одну папку (входящие в нее папки проверять не нужно). Эта папка будет с txt файлами, в этих файлах много блоков текста, разделенных разделителем. Над каждым разделителем есть ссылка на файл. Необходимо проверить, чтобы имя файла в ссылке (без расширения) находилось в текущем блоке 4 раза (считая имя в ссылке на файл). Т.е. чтобы эта фраза нашлась 4 раза в текущем блоке. В каждом блоке свое имя файла, но время от времени это имя может повторяться. Если в каком то блоке количество фраз (имен файла) не 4, то должно вывестись на экран имя файла в ссылке (в текущем блоке), а также имя txt файла, где находится текущий блок.
Разделитель такой: //==================

Пример одного txt файла (на самом деле блоков будет гораздо больше).

файл film.txt
Скрытый текст
Код:

shdfgjlhasdjlghsjlahgsajghsdlag
[img]http://s5.depic.me/01426/2zysleesxtfn_o/hdptitle.jpg[/img]

[img]http://s7.depic.me/01425/w1xhdfhweudsl6_o/0001start_m.jpg[/img]
[img]http://s7.depic.me/01425/34s1fhsfsyo_o/0001start_t.jpg[/img]

File Name.type:  0001start.mp4
Resolution:  1920x1080
Duration:  0:01:05
Filesize:  47Mb

[b]Download
[url]https://fboom.me/file/edsdhsdf0d1/0001start.mp4[/url][/b]
//==================
shdfgjlhasdjlghsjlahgsajghsdlag


[img]http://s7.depic.me/01425/rqhdfdu6_o/0002start_m.jpg[/img]
[img]http://s7.depic.me/01425/uksdffiv0zy_o/0002start_t.jpg[/img]

File Name.type:  0002start.mp4
Resolution:  1280x720
Duration:  0:00:12
Filesize:  11Mb

[b]Download
[url]https://fboom.me/file/5115645603f/0002start.mp4[/url][/b]
//==================
lasjgklhjwreak;lghsjklgljasg
[img]http://s6.depic.me/02008/t8gertar3s6_o/karton0001_m.jpg[/img]
[img]http://s6.depic.me/02008/s93wegbe9n_o/karton0001_t.jpg[/img]

karton0034.wmv | 1280x720  | 0:09:35 | 272Mb

[b]Download
[url]https://k2s.cc/file/d7eeewfg845/karton0001.mp4[/url][/b]
//==================
lasjgklhjwreak;lghsjklgljasg
[img]http://s7.depic.me/02008/sgo9rthhv3f_o/karton0002_m.jpg[/img]
[img]http://s7.depic.me/02008/i9ppqrw7eif_o/karton0002_t.jpg[/img]

karton0002.avi | 720x540  | 0:06:01 | 135Mb

[b]Download
[url]https://k2s.cc/file/011fgdfdcbec/karton0002.mp4[/url][/b]
//==================



Результат:
Код:

karton0001 - file.txt
Почему такой результат? В третьем блоке, по ссылке над разделителем, имя файла (без расширения) получается karton1.., так вот, эта фраза (karton1) находится в текущем (третьем) блоке не 4 раза (а всего 3). Поэтому вывелось имя файла в ссылке и имя txt файла, где находится этот блок. Во всех других блоках найденные имена файлов в ссылках над разделителями находятся по 4 раза, т.е. там все совпадает и поэтому не выводится на экран. :)

YuS_2 25-08-2019 15:03 2885391

Цитата:

Цитата Alexander_88
Над каждым разделителем есть ссылка на файл. Необходимо проверить, чтобы имя файла в ссылке (без расширения) находилось в текущем блоке 4 раза (считая имя в ссылке на файл). »

Цитата:

Цитата Alexander_88
Если в каком то блоке количество фраз (имен файла) не 4, то должно вывестись на экран имя файла в ссылке (в текущем блоке), а также имя txt файла, где находится текущий блок. »

Код:

function parsefile {
        process{
                $fname = $_.name
                if (($x = gc $_.fullname -raw) -match $split){
                        [array]$arr = $x -split $split
                        if ($arr.length -gt 1){
                                for($i=0;$i -lt $arr.length-1;$i++){
                                        $arr[$i] -match '(?<=\[url\])([^\[]+)(?=\[/url])'|out-null
                                        if($matches[1]){
                                                $uri = [uri]$matches[1]
                                                $r = ([io.fileinfo]$uri.segments[-1]).basename
                                                $cnt = (sls -inp $arr[$i] -patt $r -all).matches.count
                                                if($cnt -ne $count){
                                                        write-host $r - $fname -for magenta
                                                }
                                        } else { write-host Error! Name file not found. -for red }
                                }
                        }
                } else { write-host Error! $split - not found -for red }
        }
}

$fld = 'd:\*'
$flt = '*.txt'
$split = "//=================="
$count = 4

dir $fld -inc $flt -file|parsefile


Alexander_88 25-08-2019 20:41 2885411

Спасибо, все работает, только почему то файлы, в имени которых есть символы "[" "]" (квадратные скобки), не обрабатываются и появляются ошибки:

Код:

Get-Content : Не удается найти параметр, соответствующий имени параметра "raw".
C:\Users\Alexander\work\new\Новый текстовый документ.ps1:4 знак:28
+        if (($x = gc $_.fullname -raw) -match $split){
+                                  ~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-Content], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetContentCommand


Iska 25-08-2019 21:41 2885416

Alexander_88, это особенность любого языка, в котором некоторые символы внутри строк могут рассматриваться как специальные. С одной стороны, это даёт некоторые плюсы, с другой — минусы, с одним из которых Вы познакомились.

Сравните:
Код:

Get-ChildItem -Path 'C:\Мои проекты\0274' -File |`
    ForEach-Object -Process {
        $_.FullName
        Get-Content -Path $_.FullName
    }

Цитата:

Код:

C:\Мои проекты\0274\0001.txt
0001.txt content here
C:\Мои проекты\0274\[0002].txt
Get-Content : An object at the specified path C:\Мои проекты\0274\[0002].txt does not exist, or has been filtered by the -Include or -Exclude parameter.
At line:3 char:9
+        Get-Content -Path $_.FullName
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (System.String[]:String[]) [Get-Content], Exception
    + FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetContentCommand


и:
Код:

Get-ChildItem -Path 'C:\Мои проекты\0274' -File |`
    ForEach-Object -Process {
        $_.FullName
        Get-Content -Path $([Management.Automation.WildcardPattern]::Escape($_.FullName))
    }

Цитата:

Код:

C:\Мои проекты\0274\0001.txt
0001.txt content here
C:\Мои проекты\0274\[0002].txt
[0002].txt content here


Статический метод .Escape() класса Management.Automation.WildcardPattern экранирует в данном случае обе квадратные скобки в имени второго файла, в результате чего получается:
Код:

C:\Мои проекты\0274\`[0002`].txt

DJ Mogarych 25-08-2019 22:39 2885425

Цитата:

Цитата Alexander_88
файлы, в имени которых есть символы "[" "]" (квадратные скобки), не обрабатываются »

Вместо параметра -Path надо использовать -LiteralPath.

YuS_2 26-08-2019 02:45 2885435

Цитата:

Цитата Alexander_88
файлы, в имени которых есть символы "[" "]" (квадратные скобки), не обрабатываются и появляются ошибки »

Помимо способов обхода проблемы, описанных выше, стоит ещё добавить, что это не просто прихоть разработчиков или недоработка в powershell, это так называемая полезная "фича".
Квадратные скобки в путях используются для расширения возможностей простых шаблонов "*", "?", т.е. они позволяют ещё использовать и диапазоны типа [a-d], [aem] или [0-9] в именах. Например:
Код:

dir [a-c]*.* -file
- найдет все файлы с любым расширением, но только с именем, начинающимся на a, b или c ...

Alexander_88 26-08-2019 05:17 2885436

Теперь квадратные скобки не проблема, спасибо :)


Время: 03:28.

Время: 03:28.
© OSzone.net 2001-