Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

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

Ответить
Настройки темы
PowerShell - [решено] Проверить нужное количество текста в каждом блоке txt файла

Ветеран


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

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


Здравствуйте. Можно ли проверить нужное количество найденного текста в каждом блоке 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 раза, т.е. там все совпадает и поэтому не выводится на экран.

Отправлено: 09:02, 25-08-2019

 

Аватара для YuS_2

Crazy


Contributor


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

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


Цитата 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

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:03, 25-08-2019 | #2



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

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


Ветеран


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

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


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

Код: Выделить весь код
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

Отправлено: 20:41, 25-08-2019 | #3


Ветеран


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

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


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:41, 25-08-2019 | #4


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Цитата Alexander_88:
файлы, в имени которых есть символы "[" "]" (квадратные скобки), не обрабатываются »
Вместо параметра -Path надо использовать -LiteralPath.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:39, 25-08-2019 | #5


Аватара для YuS_2

Crazy


Contributor


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

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


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

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:45, 26-08-2019 | #6


Ветеран


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

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


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

Отправлено: 05:17, 26-08-2019 | #7



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Извлечение строк in.txt -> out.txt в определенном порядке+форматирование текста. ppm85 Скриптовые языки администрирования Windows 6 29-09-2015 11:29
CMD/BAT - С помощью bat-ника перенести нужное количество строк в одну в текстовом файле Rz78 Скриптовые языки администрирования Windows 7 06-06-2015 15:10
CMD/BAT - [решено] Копирование указанного количество блоков из txt файла, начиная с конца Alexander_88 Скриптовые языки администрирования Windows 9 30-08-2014 22:16
CMD/BAT - [решено] Созд.*.txt по имени файла, с перемещением *.txt и файла в папку с именем файла. OSArev Скриптовые языки администрирования Windows 2 30-01-2011 11:58
CMD/BAT - [решено] Как прочесть из файла .txt только первую строчку текста. Sdib121 Скриптовые языки администрирования Windows 6 15-08-2009 14:26




 
Переход