Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » PowerShell

Модерирует : KLASS, IFkO

KLASS (06-03-2018 00:43): Объединение тем по сценариям: Сценарии Windows
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

   

Uriu

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Версии

PowerShell 1.0 -  На текущий момент совершенно неактуальная версия, интересная только для истории. /Прямые ссылки/
PowerShell 2.0 и WinRM 2.0 - Последняя версия, работающая на Windows XP и Windows 2003 (Ещё) /Прямые ссылки/
PowerShell 3.0 (Windows Management Framework 3.0)
PowerShell 4.0 (Windows Management Framework 4.0)
PowerShell 5.0 (Windows Management Framework 5.0)
PowerShell 5.1 (Windows Management Framework 5.1)
PowerShell Core 6.0 (не заменяет PowerShell 5.1)



Ассоциация

Что бы ассоциировать скрипты с PowerShell, аналогично выполнению .bat/.cmd-файлов
нужно в командной строке набрать следующую команду(ы)
Версии 1.0-5.1 для 32-битных ОС: ftype microsoft.powershellscript.1=%windir%\system32\windowspowershell\v1.0\powershell.exe -file "%1"  
%*
 
Версии 1.0-5.1 для 32-битных ОС: ftype microsoft.powershellscript.1=%windir%\sysWOW64\windowspowershell\v1.0\powershell.exe -file "%1"  
%*
 
Версия 6.0 дя 32-битной ОС: ftype microsoft.powershellscript.1="C:\Program Files (86)\PowerShell\6.0.0\pwsh.exe"  -file "%1" %*
Версия 6.0 дя 64-битной ОС: ftype microsoft.powershellscript.1="C:\Program Files\PowerShell\6.0.0\pwsh.exe"  -file "%1" %*



вопрос о подписи скриптов

Что бы PowerShell не задавал вопрос о том, что скрипты не подписаны, ввести в нем команду
set-executionpolicy unrestricted
или в командной строке
powershell Set-ExecutionPolicy Unrestricted -force
(для этих 2-х действий требуются административные права)



Прочее


  • Если используете "белый список" в брандмауэре Windows, то для работы сценариев в сети необходимо создать 2 исходящих правила для svchost.exe и PowerShell.exe.
  • В отличие от батников кодировка скриптов на PowerShell должна быть 1251 (ANSI)




Расширение возможностей PowerShell
Функции
* Write-Color
* PowerTab --- Расширение функций клавиши Tab
Провайдеры
Готовые скрипты
* Ошибки и предупреждения в журнале событий по электронной почте (в4.0)
 


Работа со сценариями в Windows PowerShell
Раздел в MSDN
Краткие справочники по Windows PowerShell 3.0 (english)
Windows PowerShell Франк Кох (БЕРН)  Разработчик и пропагандист платформы. На русском языке в формате pdf и doc

Всего записей: 340 | Зарегистр. 25-11-2004 | Отправлено: 07:13 23-03-2006 | Исправлено: KapralBel, 09:31 29-01-2018
KapralBel



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
PS X:\> $a="q123Q123q"
PS X:\> $a.Replace("123","")
qQq

Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 15:15 12-08-2008
Drunken_Master

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Joolz
. (Точка) — любой символ.

Код:
"^.*(processname).*$"

Всего записей: 75 | Зарегистр. 11-12-2005 | Отправлено: 17:47 12-08-2008
Joolz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Drunken_Master
О! Точно! Спасибо. Я уже и забыл. А то смотрю get-help about_regular_expression, а там фига. Или это только я ее вижу???
 
Сейчас бьюсь над мониторингом процесса. Пока что выходит уродливый франкенштейн:

Код:
$date=(get-date).ToShortDateString()
$time=(get-date).ToShortTimeString()
Get-WmiObject win32_Process -computername pcname | where {$_.Name -match "process.exe"} | convertto-HTML -Property [h-z]* | foreach {$_ -replace "<tr>", "<tr bgcolor=#AABBCC>" -replace "^.*(ProcessName).*$","<tr>$time</tr>"} >>D:\Logs\log_$date.htm

Посмотрев структуру получаемого html пришел к выводу, что исходное форматирование я могу задать и сам, нужно чтобы при запуске скрипта он добавлял в лог еще одну строку таблицы. Типа <tr><td>property1</td><td>property2</td>...<td>property№</td></tr>
 
Разобрался. Правда, пришлось два скрипта делать - один для заголовка, второй для добавления строк. Можно, конечно все в один скрипт запихать, но нужно писать дополнительные условия.

Всего записей: 100 | Зарегистр. 24-01-2008 | Отправлено: 18:11 12-08-2008 | Исправлено: Joolz, 12:56 14-08-2008
Joolz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кто подскажет, как избежать "зависания" скрипта при запуске команды get-wmiobject win32_ntlogevent -computerName COMP | select -first 1. Первую запись он находит моментально, но похоже продолжает лиcтать лог до конца в холостую.

Всего записей: 100 | Зарегистр. 24-01-2008 | Отправлено: 16:40 18-08-2008 | Исправлено: Joolz, 16:41 18-08-2008
Drunken_Master

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Joolz
нужно отфильтровывать нужное "на той стороне" через параметр -Filter командлета Get-WmiObject.

Всего записей: 75 | Зарегистр. 11-12-2005 | Отправлено: 17:49 18-08-2008
Joolz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Drunken_Master
Хм. Как фильтровать параметры типа EntryType и Source понятно, но как фильтровать это безумное время, да еще и с параметрами больше или меньше.
Пробовал и через Get-WMIObject -query "Select * Ftom ....."
Но тоже пока ничего не выходит.

Всего записей: 100 | Зарегистр. 24-01-2008 | Отправлено: 11:17 19-08-2008 | Исправлено: Joolz, 11:50 19-08-2008
Drunken_Master

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Joolz
"безумное время" в DateTime:

Код:
[System.Management.ManagementDateTimeConverter]::ToDateTime($event.TimeWritten)

Обратное (DateTime в DMTF):

Код:
[System.Management.ManagementDateTimeConverter]::ToDmtfDateTime([DateTime]::Now)

 
И, например, смотрим сегодняшние события:

Код:
$t = [System.Management.ManagementDateTimeConverter]::ToDmtfDateTime((Get-Date 2008/08/19))
Get-WmiObject Win32_NtLogEvent -Filter "TimeWritten>'$t'"

Всего записей: 75 | Зарегистр. 11-12-2005 | Отправлено: 12:10 19-08-2008
Joolz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Drunken_Master
Спасибо. Честно говоря не думал что в данном случае приведение к формату позволит решить проблему.
Учитывая, что мне нужны события из журнала Application сделал так:
Get-WmiObject -query "Select * From Win32_NtLogEvent Where (TimeWritten>'$t' AND LogFile='Application')"
Можно и так:
 -Filter "TimeWritten>'$t' and LogFile='Application'"
Но скорость работы одинаковая - медленно!

Всего записей: 100 | Зарегистр. 24-01-2008 | Отправлено: 12:54 19-08-2008 | Исправлено: Joolz, 13:18 19-08-2008
Drunken_Master

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Joolz
вряд-ли можно как-то ускорить, разве что поменять местами условия:  -Filter "LogFile='Application' and TimeWritten>'$t'"

Всего записей: 75 | Зарегистр. 11-12-2005 | Отправлено: 15:17 19-08-2008
Joolz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Drunken_Master
Кстати, указаным способом он конвертит даты в убогий американский стандарт времени, а как перегнать н нормальный вид?

Всего записей: 100 | Зарегистр. 24-01-2008 | Отправлено: 17:47 19-08-2008
Refugee

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
последнюю запись можно ещё так получить:
$a = New-Object "System.Diagnostics.EventLog" "Application","compname"
$last = $a.Entries[$a.Entries.Count-1]

Всего записей: 513 | Зарегистр. 31-03-2004 | Отправлено: 22:18 19-08-2008
Joolz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно ли как-то обрабатывать список исключений кроме как
Код:
where {$_.property -ne $exclusion1 -and $_.property -ne exclusion2 -and $_.property -ne exclusion3 ... -and $_.property -ne exclusionN}
?

Всего записей: 100 | Зарегистр. 24-01-2008 | Отправлено: 11:37 20-08-2008
Drunken_Master

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Joolz

Цитата:
Кстати, указаным способом он конвертит даты в убогий американский стандарт времени

Конвертит в объект DateTime.
Список исключений:

Код:
$exclusions = $exclusion1, $exclusion2, $exclusion3, ... $exclusionN
... | where {$exclusions -notcontains $_.property}

Всего записей: 75 | Зарегистр. 11-12-2005 | Отправлено: 15:38 20-08-2008
Joolz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Drunken_Master
Гуру!!!

В очередной раз спасибо. Ты по какой книжке его изучал?

Всего записей: 100 | Зарегистр. 24-01-2008 | Отправлено: 17:24 20-08-2008
Drunken_Master

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Joolz
Тут, наверно, общий опыт программирования сказывается
Но «Windows PowerShell in Action» BRUCE PAYETTE читал, рекомендую.

Всего записей: 75 | Зарегистр. 11-12-2005 | Отправлено: 00:01 21-08-2008
dimamischenko

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2Joolz: а может файлик с:\DRV\all.drv приложишь к скрипту?
в линке что-то поменяли...

Всего записей: 13 | Зарегистр. 19-02-2004 | Отправлено: 08:35 22-08-2008
Joolz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimamischenko
Знал бы как это организовать на данном форуме - сделал бы.
Содержимое файла здесь...
 
Добавлено:
Но надо учитывать, что у меня в этом файле собраны наиболее часто встречаемые модели мониторов (и не только), так что если есть энное количество моделей, которые не попадают в этот список, до лучше таблицу дополнить самостоятельно.
 
PNPDeviceID можно узнать введяя команду из скрипта:

Код:
 
(Get-WmiObject Win32_DesktopMonitor -ComputerName $compname | ? {$_.PNPDeviceID -like "Display\*"}).PNPDeviceID -replace "^(.+\\)(.+)(\\.+)", '$2'
 

Всего записей: 100 | Зарегистр. 24-01-2008 | Отправлено: 09:18 22-08-2008 | Исправлено: Joolz, 14:57 22-08-2008
Joolz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как можно сократить скрипт?

Код:
 
$Time = [System.Management.ManagementDateTimeConverter]::ToDmtfDateTime((get-date).addhours(-1))
 
$Events=GWmi -computername DC1 Win32_NtLogEvent -Filter "LogFile='System' AND TimeWritten>'$Time'" | Where {$_.EventCode -eq 10}
 
$Events | where {$_.User -like 'DOMAIN\Username'} | where {(($_.message) -replace ".*(; pages printed: )","") -ge '2'}| ft -Property User, @{Label="Time"; Expression={[System.Management.ManagementDateTimeConverter]::ToDateTime($_.TimeGenerated)}}, @{Label="Printer"; Expression={$_.InsertionStrings[3]}}, @{Label="Pages"; Expression={(($_.message) -replace ".*(; pages printed: )","")}} -AutoSize
 

 
З.Ы. where {(($_.message) -replace ".*(; pages printed: )","") -ge '2'} не работает корректно, т.к. получаемое значение не числовое.

Всего записей: 100 | Зарегистр. 24-01-2008 | Отправлено: 11:05 04-09-2008 | Исправлено: Joolz, 12:04 04-09-2008
Drunken Master

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Joolz
Сократить не знаю, но есть ряд замечаний.
Все статические условия лучше внести в -Filter.

Код:
GWmi Win32_NtLogEvent -computername $comp -credential $c -Filter "LogFile='System' and eventcode='$ecode' AND TimeWritten>'$Time' and user like '%$username%' "

Плюс, используя -Query можно запрашивать только определенные поля.

Код:
GWmi -computername $comp -credential $c -query "select user, timegenerated, insertionstrings, message from win32_ntlogevent where LogFile='System' and eventcode='$ecode' AND TimeWritten>'$Time' and user like '%system%' "

Это должно повысить скорость работы, а в сети — чуть не на порядки
Дальше я бы вначале выбрал/сформировал нужные свойства, а потом форматировал/выводил, т.е.:

Код:
$Events | where ... | select user, @{name="time"; expression={...}},... | ft -AutoSize

 

Цитата:
where {(($_.message) -replace ".*(; pages printed: )","") -ge '2'} не работает корректно


Код:
where {[int](($_.message) -replace ".*(; pages printed: )","") -ge 2}

Всего записей: 75 | Зарегистр. 11-12-2005 | Отправлено: 16:14 04-09-2008
Joolz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Drunken Master
В очередной раз спасибо.
 
Еще вопросец. Почему код

Код:
If ($Args[$i] -match '([0-9]{1,2})d') {...}
If ($Args[$i] -match '(\d{1,2})d') {...}

не срабатывает на параметр 12d, но срабатывает на 12dd?

Всего записей: 100 | Зарегистр. 24-01-2008 | Отправлено: 18:28 04-09-2008
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » PowerShell
KLASS (06-03-2018 00:43): Объединение тем по сценариям: Сценарии Windows


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru