## posh-Commands ### Help `Get-Command *Service*` поиск команды по имени \ `Get-Help Get-Service` синтаксис \ `Get-Service | Get-Member` отобразить Method (действия: Start, Stop), Property (объекты вывода: Status, DisplayName), Event (события объектов: Click) и Alias \ `Get-Alias ps` \ `Get-Verb` действия, утвержденные для использования в командах \ `Set-ExecutionPolicy Unrestricted` \ `Get-ExecutionPolicy` ### ping `Test-Connection -Count 1 $srv1, $srv2` отправить icmp-пакет двум хостам \ `Test-Connection $srv -ErrorAction SilentlyContinue` не выводить ошибок, если хост не отвечает \ `Test-Connection -Source $srv1 -ComputerName $srv2` пинг с удаленного компьютера ### nslookup `Resolve-DnsName ya.ru -Type MX` ALL,ANY,A,NS,SRV,CNAME,PTR,TXT(spf) ### port `tnc $srv -p 5985` \ `tnc $srv -CommonTCPPort WINRM # HTTP,RDP,SMB` \ `tnc ya.ru –TraceRoute -Hops 2 # TTL=2` \ `tnc ya.ru -DiagnoseRouting` # маршрутизация до хоста, куда (DestinationPrefix: 0.0.0.0/0) через (NextHop: 192.168.1.254) ### ipconfig `Get-NetIPConfiguration` \ `Get-NetAdapter` \ `Get-NetAdapterAdvancedProperty` \ `Get-NetAdapterStatistics` ### Route `Get-NetRoute` ### Netstat `Get-NetTCPConnection -State Established,Listen | where LocalAddress -match "192.168"` ### Hash `Get-Filehash -Algorithm SHA256 "$env:USERPROFILE\Documents\RSA.conf.txt"` ### Clipboard `Set-Clipboard $srv` скопировать в буфер обмена \ `Get-Clipboard` вставить ### Array `$srv = @("server-01", "server-02")` создать массив \ `$srv += @("server-03")` добавить в массив новый элемент \ `$srv.Count` отобразить кол-во элементов в массиве \ `Out-String` построчный вывод ### Index `$srv[0]` вывести первое значение элемента массива \ `$srv[0] = Name` замена элемента в массиве \ `$srv[0].Length` узнать кол-во символов первого значения в массиве \ `$srv[10..100]` срез ### PSCustomObject `$obj = @()` \ `$obj += [PSCustomObject]@{User = $env:username; Server = $env:computername}` медленный метод добавления, в каждой интерации перезаписывается массив и коллекция становится фиксированного размера (Collection was of a fixed size) `$Collections = New-Object System.Collections.Generic.List[System.Object]` \ `$Collections.Add([PSCustomObject]@{User = $env:username; Server = $env:computername})` `Get-Service | Select Name,DisplayName,Status,StartType | Export-csv -path "$home\Desktop\Get-Service.csv" -Append -Encoding Default` экспортировать в csv (-Encoding UTF8) \ `Import-Csv "$home\Desktop\Get-Service.csv" -Delimiter ","` импортировать массив ### Pipeline `$obj | Add-Member -MemberType NoteProperty -Name "Type" -Value "user" -Force` добавление объкта вывода NoteProperty \ `$obj | Add-Member -MemberType NoteProperty -Name "User" -Value "admin" -Force` изменеие содержимого для сущности объекта User \ `ping $srv | Out-Null` перенаправить результат вывода в Out-Null ### Variable `$var = Read-Host "Enter"` ручной ввод \ `$pass = Read-Host "Enter Password" -AsSecureString` скрывать набор \ `$global:path = "\\path"` задать глобальную переменную, например в функции \ `$using:srv` использовать переменную текущей сесси в Invoke-сессии \ `Get-Variable` отобразить все переменные \ `Get-Variable *srv*` найти переменную по имени \ `Get-Variable -Scope Global` отобразить все глобальные переменные \ `Get-Variable Error` последняя команда с ошибкой \ `Remove-Variable -Name *` очистить все переменные \ `$LASTEXITCODE` содержит код вывода последней запущенной программы, например ping. Если код возврата положительный (True), то $LastExitCode = 0 ### ENV `Get-ChildItem Env:` отобразить все переменные окружения \ `$env:PSModulePath` директории импорта модулей \ `$env:userprofile` \ `$env:computername` \ `$env:username` \ `$env:userdnsdomain` \ `$env:logonserver` \ `([DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Name` \ `[Environment]::GetFolderPath('ApplicationData')` ### GetType `$srv.GetType()` узнать тип данных \ `$srv -is [string]` проверка на соответствие типа данных \ `$srv -isnot [System.Object]` проверка на несоответствие \ `$char = $srv.ToCharArray()` разбить строку [string] на массив [System.Array] из букв \ `$char.GetType()` тип данных: Char[] \ `[Object]` массив (BaseType:System.Array) \ `[int]` целое число (BaseType:System.ValueType) \ `[String]` строка-текст (BaseType:System.Object) \ `[DateTime]` формат времени (BaseType:System.ValueType) ### Property `$srv.Count` кол-во элементов в массиве \ `$srv.Length` содержит количество символом строки переменной [string] или количество значений (строк) объекта \ `$srv.Chars(2)` отобразить 3-й символ в строке \ `$srv[2]` отобразить 3-ю строку в массиве ### Method `$srv.Insert(0,"https://")` добавить значение перед первым символом \ `$srv.Substring(4)` удалить (из всего массива) первые 4 символа \ `$srv.Remove(3)` удалить из всего массива все после 3 символа \ `$string = "123"` создать строку \ `$int = [convert]::ToInt32($string)` преобразовать строку в тип данных число \ `[string]::Concat($text,$num)` объеденить переменные в одну строку \ `[string]::Join(":",$text,$num)` объеденить используя разделитель \ `[string]::Compare($text,$num,$true)` выдает 0 при совпадении или 1/-1 при несовпадении, $true (без учета регистра) или $false (с учетом регистра) \ `[string]::Equals($text,$num)` производит сравнение двух строк и выдает $true при их совпадении или $false при несовпадении \ `[string]::IsNullOrEmpty($text)` проверяет наличие строки, если строка пуста $true, если нет $false \ `[string]::IsNullOrWhiteSpace($text2)` проверяет на наличие только символов пробел, табуляция или символ новой строки ### Get-Date `(Get-Date).AddHours(-3)` \ `$Date = (Get-Date -Format "dd/MM/yyyy hh:mm:ss")` \ `$Date = Get-Date -f "dd/MM/yyyy"` получаем тип данных [string] \ `[DateTime]$gDate = Get-Date "$Date"` преобразовать в тип [DateTime] \ `[int32]$days=($fDate-$gDate).Days` получить разницу в днях \ `"5/7/07" -as [DateTime]` преобразовать входные данные в тип данных [DateTime] ### Regex (регулярные выражения) `-replace "1","2"` замена элементов в индексах массива (везде где присутствует 1, заменить на 2), для удаления используется только первое значение \ `-split " "` преобразовать строку в массив, разделителем указан пробел, которой удаляется ($url.Split("/")[-1]) \ `-join " "` преобразовать массив (коллекцию) в единую строку (string), добавить разделителем пробел \ `$iplist -contains "192.168.1.1"` проверить, что в массиве есть целое значение, выводит True или False \ `"192.168.1.1" -in $iplist` проверить на наличие указанного значения в массиве \ `-like *txt*` поиск по маскам wildcard, выводит значение на экран \ `-match txt` поиска по шаблонам, проверка на соответствие содержимого текста \ `-match "zabbix|rpc"` условия, для поиска по нескольким словам \ `-NotMatch` проверка на отсутствие вхождения \ `$ip = "192.168.10.1"` \ `$ip -match "(\.\d{1,3})\.\d{1,2}"` True \ `$Matches` отобразить все подходящие переменные последнего поиска, которые входят и не входят в группы () ### Группировка `if ((($1 -eq 1) -and ($2 -eq 2)) -or ($1 -ne 3)) {"$true"} else {"$false"}` два условия: (если $1 = 1 и $2 = 2) или $1 не равно 3. Если хотя бы одно из выражений равно True, то все условие относится к True и наоборот \ `-and` логическое И \ `-or` логическое ИЛИ \ `!(Test-Path $path)` # логическое НЕТ (-not), если путь недоступен, вернет True ### Специальные символы `\d` число от 0 до 9 (20-07-2022 эквивалент: "\d\d-\d\d-\d\d\d\d") \ `\w` буква от "a" до "z" и от "A" до "Z" или число от 0 до 9 \ `\s` пробел, эквивалент: " " \ `\n` новая строка \ `\b` маска, определяет начало и конец целого словосочетания для поиска \ `.` обозначает любой символ, кроме новой строки \ `\` экранирует любой специальны символ (метасимвол). Используется, если нужно указать конкретный символ, вместо специального ({ } [ ] / \ + * . $ ^ | ?) \ `+` повторяется 1 и более раз (\s+) \ `{1,25}` квантификатор, указывает количество повторений символа слева на право (от 1 до 25 раз) \ `[]` поиск совпадения любой буквы, например, [A-z0-9] от A до z и цифры от 0 до 9 ("192.168.1.1" -match "192.1[6-7][0-9]") ### Якори `^` или `\A` определяет начало строки. $url -replace '^','https:' # добавить в начало; \ `$` или `\Z` обозначают конец строки. $ip -replace "\d{1,3}$","0" \ `(?=text)` поиск слова слева. Пишем слева на право от искомого (ищет только целые словосочетания) "Server:\s(.{1,30})\s(?=$username)" \ `(?<=text)` поиск слова справа. $in_time -replace ".+(?<=Last)" # удалить все до слова Last \ `(?!text)` не совпадает со словом слева \ `(?