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

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

Ответить
Настройки темы
PowerShell - [решено] [Вопрос новичка] Ошибка в скрипте PowerShell

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


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

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


Доброго времени суток, уважаемые форумчане! Прошу прощения, если этой темой нарушил какое-то правило форума, если подобный вопрос уже был или решение покажется вам слишком очевидным, первый раз использую PowerShell и поиск по гуглу/форуму ничего не дал. Буду признателен за любую помощь в исполнении простого скрипта.

Задача: Есть текстовый документ, содержащий в себе данные типа:
Код: Выделить весь код
1
2
1
2
1
4
1
Мне необходимо, чтобы PowerShell выдал мне информацию, что в текстовом документе:
1 - 3
2 - 2
4 - 1

Код: Выделить весь код
Get-Content .\smm.txt | ForEach-Object -Begin { $wordCounts.@{} } -Process { $wordCounts.$_++ } -End { $wordCounts.GetEnumerator() | Sort-Object -Property Value }
и PowerShell возвращает мне следующую информацию:
Код: Выделить весь код
Не удается найти свойство "2" для данного объекта. Убедитесь, что оно существует и его можно задать.
строка:1 знак:78
+ ... Object -Begin { $wordCounts.@{} } -Process { $wordCounts.$_++ } -End  ...
+                                                  ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound
 
Не удается найти свойство "1" для данного объекта. Убедитесь, что оно существует и его можно задать.
строка:1 знак:78
+ ... Object -Begin { $wordCounts.@{} } -Process { $wordCounts.$_++ } -End  ...
+                                                  ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound
 
Не удается найти свойство "2" для данного объекта. Убедитесь, что оно существует и его можно задать.
строка:1 знак:78
+ ... Object -Begin { $wordCounts.@{} } -Process { $wordCounts.$_++ } -End  ...
+                                                  ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound
 
Не удается найти свойство "1" для данного объекта. Убедитесь, что оно существует и его можно задать.
строка:1 знак:78
+ ... Object -Begin { $wordCounts.@{} } -Process { $wordCounts.$_++ } -End  ...
+                                                  ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound
 
Не удается найти свойство "4" для данного объекта. Убедитесь, что оно существует и его можно задать.
строка:1 знак:78
+ ... Object -Begin { $wordCounts.@{} } -Process { $wordCounts.$_++ } -End  ...
+                                                  ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound
 
Не удается найти свойство "1" для данного объекта. Убедитесь, что оно существует и его можно задать.
строка:1 знак:78
+ ... Object -Begin { $wordCounts.@{} } -Process { $wordCounts.$_++ } -End  ...
+                                                  ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound
 
Невозможно вызвать метод для выражения со значением NULL.
строка:1 знак:104
+ ... ++ } -End { $wordCounts.GetEnumerator() | Sort-Object -Property Value ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
Еще по возможности, данные выгрузки необходимо сохранить в csv/любой другой файл с встречающимися словами и кол-вами повторений, чтобы была возможность их как-то сортировать и обрабатывать. Буду благодарен любой помощи в данном вопросе)

Отправлено: 12:32, 26-01-2020

 

Ветеран


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

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


Цитата coollogan:
загрузил файл для теста на диск: yadi.sk/d/a4DIRzf2qCISYg (надеюсь на форуме разрешено делиться ссылками на текстовые документы) »
coollogan, упакуйте Ваш текстовый файл в архив.

Отправлено: 14:43, 28-01-2020 | #11



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

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


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


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

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


Цитата Iska:
coollogan, упакуйте Ваш текстовый файл в архив. »
Iska, готово: https://yadi.sk/d/0cw4wmiQITeQww

Отправлено: 15:32, 28-01-2020 | #12


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

fascinating rhythm


Moderator


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

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


coollogan, объём данных, который вы обрабатываете, весьма большой.
Необходимо дождаться окончания работы скрипта - да, он может работать несколько часов.
Если вы хотите быстрее, надо запускать на более мощном железе.

Либо, сначала модифицировать сам исходный файл, например, убрать https://www.instagram.com/, а оставлять только логины - это уменьшит время обработки, т. к. объём файла будет меньше.

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


Последний раз редактировалось DJ Mogarych, 28-01-2020 в 16:01.


Отправлено: 15:46, 28-01-2020 | #13


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


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

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


Цитата DJ Mogarych:
Необходимо дождаться окончания работы скрипта »
Спасибо, будем пробовать, смущало что в этот момент ничего не происходит, ни статус-бара, ни логов, ничего)
Следующий на обработку файл – 147мб, боюсь представить сколько времени займет процесс.

Отправлено: 15:57, 28-01-2020 | #14


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

fascinating rhythm


Moderator


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

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


Ну, можно, наверное, намутить какой-то вывод в консоль процесса, но это ещё больше растянет время обработки.

coollogan, я упустил одну важную вещь!
Уберите из скрипта
Код: Выделить весь код
@{e={$_.name -as [int]}}
В изначальном условии вы давали цифры, а в результате обрабатываете нецифровые строки.

Так что
Код: Выделить весь код
gc C:\temp\PS.txt |group -noel |select name,count |sort name |Export-Csv C:\temp\PS.csv ';' -NoType
Можно, чтобы было побыстрее, не сортировать, это можно будет сделать потом:
Код: Выделить весь код
gc C:\temp\PS.txt |group -noel |Export-Csv C:\temp\PS.csv ';' -NoType

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


Последний раз редактировалось DJ Mogarych, 28-01-2020 в 17:57.

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

Отправлено: 16:53, 28-01-2020 | #15


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


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

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


DJ Mogarych, большое спасибо за помощь)

Отправлено: 18:00, 28-01-2020 | #16


Ветеран


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

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


Цитата DJ Mogarych:
В изначальном условии вы давали цифры, а в результате обрабатываете нецифровые строки. »
Это как всегда .


coollogan, Вам действительно нужен подсчёт количества повторов? Может быть, задача проще, и Вам достаточно просто отобрать уникальные значения, без подсчёта повторов, не?!

Отправлено: 19:05, 28-01-2020 | #17


Ветеран


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

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


coollogan, можете попробовать на WSH (используем OLE DB):
Скрытый текст
Код: Выделить весь код
Option Explicit

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = 1


Dim strSourceFile
Dim strDestFile
Dim strPath2Schema

Dim objRecordset

Dim dtStartDateTime


strSourceFile = "PS.txt"
strDestFile   = "ResultFile.csv"

With WScript.CreateObject("Scripting.FileSystemObject")
	strPath2Schema = .GetParentFolderName(WScript.ScriptFullName)
	
	dtStartDateTime = Now()
	WScript.Echo "Start at:  " & CStr(dtStartDateTime)
	
	If Not .FileExists(.BuildPath(strPath2Schema, "Schema.ini")) Then
		With .CreateTextFile(.BuildPath(strPath2Schema, "Schema.ini"), True)
			.Write _
				"[" & strSourceFile & "]" & vbCrLf & _
				"ColNameHeader=False" & vbCrLf & _
				"CharacterSet=1251" & vbCrLf & _
				"Format=Delimited(;)" & vbCrLf & _
				"TextDelimiter=none" & vbCrLf & _
				"Col1=Url Text" & vbCrLf & _
				"" & vbCrLf & _
				"[" & strDestFile & "]" & vbCrLf & _
				"ColNameHeader=True" & vbCrLf & _
				"CharacterSet=1251" & vbCrLf & _
				"Format=CSVDelimited" & vbCrLf & _
				"TextDelimiter=none" & vbCrLf & _
				"Col1=Url Char Width 255" & vbCrLf & _
				"Col2=Count Integer" & vbCrLf
			
			.Close
		End With
	End If
	
	If .FileExists(.BuildPath(strPath2Schema, strDestFile)) Then
		.DeleteFile .BuildPath(strPath2Schema, strDestFile), True
	End If
	
	WScript.CreateObject("ADODB.Recordset").Open _
		"SELECT S.[url], COUNT(S.[url]) AS [Count] INTO [" & strDestFile & "] " & _
		"FROM [" & strSourceFile & "] AS S " & _
		"GROUP BY S.[url] " & _
		"ORDER BY COUNT(S.[url]) DESC", _
		"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath2Schema & ";Extended Properties=""text;""", _
		adOpenStatic, adLockOptimistic, adCmdText
	
	WScript.Echo "Finish at: " & CStr(Now())
	WScript.Echo "Total: " & CStr(DateDiff("s", dtStartDateTime, Now())) & " second(s)."
End With

WScript.Quit 0

Поместите скрипт рядом с Вашим файлом PS.txt.

У меня получается на Вашем выложенном файле PS.txt так:
Скрытый текст

с сортировкой — чуть больше двадцати секунд (без сортировки — чуть больше пятнадцати секунд).

NB! Важное замечание: на x64 ОС нужно использовать x86-версии cscript.exe/wscript.exe, т.е., прямо указывать путь к ним из каталога C:\Windows\SysWOW64 (см. скриншот под спойлером выше).
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:16, 28-01-2020 | #18


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


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

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


Цитата Iska:
Это как всегда . »
Ктож знал, что есть отличия) За то теперь запомню точно))

Цитата Iska:
Вам действительно нужен подсчёт количества повторов? »
Да, задача такая, нужно собрать топ ±3000 повторяющихся строк из списка)

Цитата Iska:
можете попробовать на WSH (используем OLE DB): »
Спасибо! Завтра попробую изучить, начну с того, что такое WSH
Это встроенная функция как PowerShell, или можно её скачать? Мне советовали использовать AWK, чуть с ума не сошел изучая сайты которые хоть что-то пишут про него) Да пишут так, как будто первые 499 страниц инструкции куда-то делись, и начинается с пятисотой)) Понял, что не мой вариант, хотя там такой массив данных обрабатывался за несколько секунд тоже)

Отправлено: 22:01, 28-01-2020 | #19


Ветеран


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

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


Цитата coollogan:
начну с того, что такое WSH »
1. Сохраните код в файл с расширением .vbs, получив скрипт WSH (Windows Script Host).
2. Расположите данный скрипт рядом с Вашим файлом PS.txt.
3. Вызовите скрипт на исполнение.

Если Ваша ОС — x64, то вместо пункта 3 будут следующие пункты:

3. Откройте интерпретатор команд: Win-R, «"%comspec%" /k», Enter.
4. Перетащите из окна Проводника в окно интерпретатора команд файл «C:\Windows\SysWOW64\cscript.exe».
5. Нажмите пробел, находясь в окне интерпретатора команд.
6. Перетащите из окна Проводника в окно интерпретатора команд скрипт WSH (файл с расширением .vbs), созданный в пп.1-2.
7. Нажмите Enter, находясь в окне интерпретатора команд.

Отправлено: 23:12, 28-01-2020 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Redhat/Fedora - вопрос новичка - имя ПК chek Общий по Linux 1 23-10-2017 19:53
Разное - С чего начать настройку Windows 7 x64 ? - какие статьи прочитать (вопрос/ы новичка). Макс Фолдер Microsoft Windows 7 23 06-03-2016 05:33
CMD/BAT - ошибка в скрипте cyber_ua Скриптовые языки администрирования Windows 4 01-03-2012 16:46
VBS/WSH/JS - ошибка в скрипте D_e_n_n Скриптовые языки администрирования Windows 3 12-08-2011 14:03
Вопрос новичка, о CSS+DIV верстке Bullet-Avalon Вебмастеру 12 17-02-2009 00:57




 
Переход