Вводное:
powershell = командная оболочка, язык сценариев 1. Глагол - существительное (действие) - (объект) 2. Все время работаем с объектами
Начало работы:
Клавиша "TAB" авто дополнение ввода команд. Get-Service - показать службы Get-Process - показать процессы history - показать историю команд
Начало работы со справкой:
Get-help - справка общая Get-Command - справка по команде -Verb - глагол / действие Get-Command -Verb Get - покажет команды начинающиеся на Get -Noun - существительное / объект Get-Command -Noun service - покажет команды управления службами Get-Command -Noun Module - покажет команды управления модулями Get-Help Get-Module - показать справку по команде Get-Module где мы увидим интересный ключ -ListAvailable Get-Module -ListAvailable - покажет все доступные команды модуля Get-Module Get-Command -Module NetTCPIP - покажет информацию по функции NetTCPIP Get-Command -Module NetAdapter - покажет информацию по функции NetAdapter Help - помощь алиас команды Get-Help Update-Help - обновление справочника команд Get-Help Get-NetIPAddress - получить справку по модулю Get-NetIPAddress Get-Help Get-NetIPAddress -Detailed - получить справку по модулю Get-NetIPAddress, подробнее Get-Help Get-NetIPAddress -Full - получить справку по модулю Get-NetIPAddress, все что есть Get-Help Get-NetIPAddress -Examples - получить примеры использования команды Get-Help *IPaddress* - будет показано все команды где встречается *IPaddress* Get-Help about* - будут показаны файлы abaut, они не связаны с конкретным модулем или функциями но в них есть интересная информация. Get-Help about_aliases - будет показана справка по about_aliases Get-Alias - показать все синонимы команд
Поиск команд кратко:
Update-Help Get-Command -Verb -Noun -Module Get-Module -ListAvailable Get-Help "Название команды" -Detailed -Full -Examples -Online
Пример поиска команды создания директории:
Get-Help mkdir - я помню что в cmd команда звучит как mkdir, ищу и нахожу команду New-Item Get-Help New-Item - получаю справку по команде New-Item Get-Help New-Item -Examples - получаю примеры использования New-Item -Path .\zxc1234 -ItemType Directory - создаю директорию zxc1234 в текущем каталоге
Конвейер:
!!! В powershell самая важная часть это конвейеры! Get-Service | Sort-Object Status | Select-Object -First 10 - нам покажут следующие: Get-Service выведет список сервисов и передаст дальше по конвейеру, Sort-Object примет данные, отсортирует по Status и отправит далее, Select-Object выберет первые 10 объектов и выведет результат на экран. Для использования конвейера нужно понимать следующие: 0. Какие объекты передаются - свойства - методы 1. Какие свойства у объектов Get-Member - полезная команда позволяет узнать свойства объекта и методы, параметры Get-Service | Get-Member - узнаем какие есть методы и свойства у команды Get-Service Get-Service | Get-Member -MemberType Properties - узнаем какие есть свойства у команды Get-Service dir - алиас команды Get-ChildItem dir c:\ Get-ChildItem c:\ dir c:\ | Get-Member dir c:\windows | Get-Member -MemberType Property Get-Process Get-Process |Get-Member Get-Process | Sort-Object -Property CPU По умолчанию отображается по возрастанию а параметр "-Descending" позволяет отсортировать с большего к меньшему. Get-Process | Sort-Object -Property CPU -Descending Что бы показать последние первые пять можно сделать выборку Select-Object -First 5 Get-Process | Sort-Object -Property CPU -Descending |Select-Object -First 5 -Property - это свойство объекта -Method - это действие над объектом Get-Service | Get-Member -MemberType Method - покажет доступны методы для Get-Service Get-Service | Select-Object -First 3 - покажет первые три службы Для выполнения метода есть специальная конструкция "ForEach-Object метод" Get-Service | Select-Object -First 3 | ForEach-Object Stop Get-Service | Out-File "xxx.txt" - перенаправить вывод команды в файл Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 10 | Out-File "ten_process_use_cpu.txt" - сохранит в файл ten_process_use_cpu.txt вывод команд в конвейере, там будет 10 процессов использующих больше всех CPU. Out-File - это перенаправление вывода, и подходит для чтения человеком Export-CSV - это специальный формат csv удобно читаемы для машины Get-Service | Export-Csv "get_service.csv" Get-Process |Sort-Object -Property CPU -Descending | Select-Object -First 10 | Export-CSV "ten_process_use_cpu.csv" Import-Csv .\get_service.csv - выведет на экран содержимое CSV файла Import-Csv .\get_service.csv | Get-Member - спросим у Get-Member что это Import-Csv .\get_service.csv | Select-Object -First 1 Format-Table - выполнит форматирование отображения в виде таблицы Format-Wide - выведет форматирование отображения в сокращенном виде Import-Csv .\get_service.csv | Select-Object -First 1 | Format-Table Import-Csv .\get_service.csv | Select-Object -First 1 | Format-Wide Import-Csv .\get_service.csv | Select-Object -First 1 | ForEach-Object start Import-Csv .\get_service.csv | Select-Object -First 1 | ForEach-Object stop
Абстракция файловой системы
Get-ChildItem ...-item ...-Content ...-ItemProperty + ...-PSDrive ...-PSProvider dir Get-Alias dir Get-ChildItem Get-Command -Noun ChildItem Get-Help Get-ChildItem Get-Alias md - cоздать директорию md алиас mkdir Get-Alias rd - удалить директорию rd алиас Remove-Item В powershell для работы с файловыми системами(AD, SQL бд, фс, реестр, и т.д.) microsoft придумал специальный драйвер PSProviders Get-PSProvider - покажет доступные psproviders Get-PSDrive - покажет доступные подключенные диски\разделы диска Dir C:\ - показать содержимое диска c:\ Dir HKCU:\ - показать содержимое реестра HKCU Dir HKLM:\ - показать содержимое реестра HKLM Dir Env:\ - показать переменные окружения Get-Command -Noun PSDrive - смотрим что мы можем делать с PSdrive Get-Help New-PSDrive - смотрим что может делать команда New-PSDrive New-PSDrive [-Name][-PSProvider] [-Root] - синтаксис из Get-Help, требуется указать -Name Имя_точки_монтирования, -PSProvider испозуемый_провайдер, -Root Что_монтируем New-PSDrive Power -PSProvider Registry -Root "HKCU:\Control Panel\Powercfg" - монтирование ветки реестра HKCU:\Control Panel\Powercfg в Power Get-PSDrive - смотрим доступные провайдеры Dir Power:\ - показываем содержимое Get-Command -Noun Item - смотрим что мы можем делать с объектами Get-Help New-Item - смотрим справку по New-Item, из справки узнаем что команда служит для создания объектов New-Item ".\myfile.txt" -ItemType File - создаем файл myfile.txt в текущем каталоге New-Item "C:\\myfile.txt" -ItemType File - создаем файл myfile.txt в корне диска C: (!!! нужны права на запись, ps должен быть запущен от админа) Get-Command -Noun Content - узнаем о командах Content Get-Help Set-Content - узнаем что команда Set-Content позволяет записать в файл Set-Content [-Path] [-Value] - синтаксис команды Set-Content, требуется -Path путь_к_файлу, и -Value что_нужно_записать_в_файл Set-Content ".\myfile.txt" -Value "Моя первая запись в файл" Get-Content .\myfile.txt - смотрим что в файле Get-Help Add-Content - смотрим что умеет делать Add-Content, читаем умеет добавлять запись в объект Add-Content ".\myfile.txt" -Value "Моя вторая запись" Get-Content .\myfile.txt - читаем файл Get-Command -Noun ItemProperty - смотрим что такое ItemProperty и какие команды доступны Get-Help Get-ItemProperty - узнаем подробнее про команду Get-ItemProperty, команда позволяет посмотреть свойства объекта Get-ItemProperty .\myfile.txt - посмотреть свойства объекта myfile.txt Get-ChildItem Power: - посмотреть содержимое объекта Power: (где-то выше монтировали куст реестра) New-Item Power:\Test1 -ItemType "Folder" - создадим папку Power:\Test1 New-item Power:\Test1\Test2 -ItemType "Folder" - создадим папку Power:\Test1\Test2 dir Power: - посмотреть содержимое объекта Power: Get-Help New-Item -Online - посмотрим онлайн справку по New-Item dir "c:\" | Get-Member - смотрим структуру объектов в c:\ dir "Power:\" | Get-Member - смотрим структуру объектов в Power:\ Get-Help New-PSDrive -Examples New-PSDrive -Name "P" -Root \\www\img\c -PSProvider "FileSystem" - примонтировать сетевой диск \\www\img\c использовать букву "P" для точки монтирования Get-PSDrive - посмотреть что мы там примонтировали Remove-PSDrive "P" New-PSDrive -Name "zabir" -Root \\www\img\c -PSProvider "FileSystem" - небольшой прикол :) Get-PSDrive - посмотреть что мы там примонтировали dir zabir:\ Remove-PSDrive "zabir"
Простые операции в конвейере
Get-Command -Noun Object - посмотреть доступные команды для работы с объектами Select-Object -Property -Descending Sort-Object -Property @{n="...", e={...}} -First -Last -Skip Where-Object -EQ, -NE, -GT, -Like... -FilterScript {...} Group-Object -Property Measure-Object ForEach-Object -MemberName Compare-Object -Property - этот параметр применяется по умолчанию. dir C:\Windows - посмотрим содержимое каталога windows dir C:\Windows | Get-Member - посмотрим доступные свойства, методы и т.д. dir C:\Windows\ | Sort-Object Length - сортируем объекты (по умолчанию сортировка по возрастанию) dir C:\Windows\ | Sort-Object Length -Descending - сортируем объекты по убыванию New-Item zxc1.txt -ItemType File - создадим файл zxc1.txt в текущем каталоге New-Item zxc2.txt -ItemType File - создадим файл zxc2.txt в текущем каталоге New-Item zxc10.txt -ItemType File - создадим файл zxc10.txt в текущем каталоге dir . | Sort-Object Length - попробуем отсортировать файлы по размеру dir . | Sort-Object -Property Length, Name - сортируем объекты по размеру и имени dir C:\Windows | Get-Member -MemberType Properties - посмотреть какие есть параметры для дальнейшей обработки Select-Object - команда Select-Object позволяет делать выборку объектов, сверху, снизу, показывать нужное dir C:\Windows | Select-Object -Property FullName, Extension Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 | Select-Object Handles, Name, VM, CPU $PSItem - текущий элемент списка @{n="Size in KB"; e={$PSItem.Length}} - создание своего свойства @{n="Size in KB"; e={$_.Length / 1024}} - выполняем действие со свойством $_.Length / 1024 dir C:\Windows | Select-Object -Property FullName, Length, @{n="Size in KB"; e={$PSItem.Length}} - пример использования своего свойства dir C:\Windows | Select-Object -Property FullName, Length, @{n="Size in KB"; e={$_.Length}} - пример использования своего свойства dir C:\Windows | Select-Object -Property FullName, Length, @{n="Size in KB"; e={$_.Length / 1024}} | Sort-Object -Property "Size in KB" -Descending - пример использования своего свойства dir C:\Windows | Select-Object -Property FullName, Length, @{n="Size in KB"; e={$_.Length / 1024}} | Sort-Object -Property "Size in KB" -Descending | Select-Object -First 10 Get-Help Where-Object -Examples - получили справку по команде Where-Object dir c:\windows | Where-Object Length -GT 100000 - показать файлы больше 100000 dir C:\Windows | Where-Object Extension -EQ ".EXE" - показать файлы с расширением EXE dir C:\Windows | Where-Object Extension -CEQ ".exe" - показать файлы с расширением exe, CEQ говорит о том что ищем exe с соблюдением регистра Get-Process | Where-Object Name -EQ "Chrome" - показать все процессы с именем Chrome dir C:\Windows | Where-Object Name -Like "e*" - показать файл который начинается на букву "e" в каталоге C:\Windows dir C:\Windows | Where-Object Name -Like "*e" - показать файл который заканчиваются на букву "e" в каталоге C:\Windows dir C:\Windows | Where-Object -FilterScript {$_.Extension -Like ".exe" -and $_.Name -like "h*" -and $_.Length -ge 100000 } - показать файл ".exe", имя начинается на "h", размером больше 100000 dir C:\Windows | Where {$_.Extension -Like ".exe" -and $_.Name -like "h*" -and $_.Length -ge 100000 } - показать файл ".exe", имя начинается на "h", размером больше 100000 Get-Process | sort CPU -Descending | select Name, CPU, VM , Path | Where-Object Name -Like "chrome" - показать отсортированные процессы с именем "chrome" dir C:\Windows | Where-Object Extension -Like ".exe" | Measure-Object -Property Length -Sum - показать какой размер у объектов exe dir C:\Windows | Where-Object Extension -Like ".exe" | Measure-Object -Property Length -Sum -Maximum -Minimum -Average - показать какой размер у объектов exe, минимальные и максимальные размеры объектов Get-Process | sort CPU -Descending | select Name, CPU, VM , Path | Where-Object Name -Like "chrome" | Measure-Object -Property CPU -SUM - посчитать какое потребление CPU у процессов с именем "chrome" Get-Process | sort CPU -Descending | select Name, CPU, VM , Path | Where-Object Name -Like "chrome" | Measure-Object -Property VM -SUM - посчитать какое потребление VM у процессов с именем "chrome" dir C:\Windows | Group-Object -Property Extension - сгруппировать и показать количество объектов по их расширению, в каталоге C:\Windows dir C:\Windows -Recurse | Group-Object -Property Extension - сгруппировать и показать количество объектов по их расширению, включая вложенные папки Get-Service | group status - сгруппировать и показать статус служб Get-Process -IncludeUserName | Sort-Object cpu -Descending | select Name, cpu, vm, username - показать процессы, отсортировать по CPU, выполнить выборку по: Name, cpu, vm, username Get-Process -IncludeUserName | Sort-Object cpu -Descending | select Name, cpu, vm, username | Group-Object username - показать процессы, отсортировать по CPU, выполнить выборку по "Name, cpu, vm, username", сгруппировать и показать процессы по пользователям. dir C:\Windows\ | Where-Object Length -ge 100 | Group-Object Extension | Where-Object Count -Ge 3 - по итогу покажет группы в которых файлов больше 3 dir C:\Windows | Where-Object Extension -EQ ".log" | Get-Member -MemberType Method - показать какие методы мы можем применить к объектам New-Item test111 -ItemType Directory - создаем директорию test111 в текущем каталоге New-Item .\test111\zxc.txt -ItemType File - создаем файл zxc.txt в каталоге test111 New-Item .\test111\zxc1.txt -ItemType File - создаем файл zxc1.txt в каталоге test111 New-Item .\test111\zxc2.txt -ItemType File - создаем файл zxc2.txt в каталоге test111 dir .\test111 | Where-Object Extension -eq ".txt" | Get-Member - показать какие методы мы можем применить к объектам dir .\test111\zxc.txt | Get-Member - показать какие методы мы можем применить к объектам dir .\test111\zxc.txt | ForEach-Object -MemberName Delete - удалит файл dir .\test111 | Where-Object Extension -EQ ".txt" | ForEach-Object -MemberName Delete - из каталога test111 будут удалены все файл c расширением ".txt" dir .\test111 | Where-Object Extension -EQ ".txt" | ForEach-Object Delete - из каталога test111 будут удалены все файл c расширением ".txt" dir C:\Windows | Where-Object Extension -EQ ".txt" | ForEach-Object {$_.Delete()} - из каталога C:\Windows будут удалены все файл c расширением ".txt" (для вложенных каталогов нужно использовать параметр -Recurse) Remove-Item .\test111 - удалить каталог test111
Форматирование результатов
Get-Command -Verb Format dir c:\windows | Format-Table dir c:\windows | Get-Member dir c:\windows | Format-Table -Property Name, Extension, Length Get-Service | Get-Member Get-Service | FT Name, Status, CanStop, Canshutdown Get-Service | FT Name, Status, CanStop, CanShutdown -AutoSize Get-Service | sort Status | FT Name, Status, CanStop, CanShutdown -AutoSize -GroupBy Status Get-Process | Sort-Object CPU -Descending |FT ProcessName, CPU -AutoSize Get-Process | Sort-Object CPU -Descending | FT CPU, @{n="Name"; e={$_.ProcessName}; align="right"} Get-Service | FT Status, @{n="Name"; e={$_.Name}; align="right"} Get-Service | Format-List -Property Name, Status Get-Service | sort Status| Format-Wide -Property Name -column 5 -GroupBy Status
Начало и конец конвейера в powershell
Get-Command -Verb Export Get-Command -Verb Export -Module Microsoft.PowerShell.Utility Get-Command -Verb ConvertTo Get-Command -Verb Out !!! Разница между Export и ConverTo следующая: !!! Export завершает конвейер !!! ConvertTo конвейер не завершает и может передать дальше Get-Service | Out-GridView Get-Process | Out-GridView Get-Service | ConvertTo-Html | Out-File "xxx.html" - получаем список служб, конвертируем в html и сохраняем в файл xxx.html Get-Service | ConvertTo-Html -Title "Список служб" -PreContent "Мои службы
" | Out-File "xxx.html" - получаем список служб, конвертируем в html и сохраняем в файл xxx.html, украшаем html заголовком и т.д. Get-Service | ConvertTo-Json | Out-File "xxx1.Json" - получаем список служб, конвертируем в Json и сохраняем в файл xxx1.Json Get-Service | Export-Csv "zxc2.csv" - получаем список служб и экспортируем в файл zxc2.csv Get-Content "xxx1.json" | ConvertFrom-Json - читаем файл и передаем его в конвейер Get-Command -Verb Import - получаем документацию по Import
Передача параметров в powershell
Классический способ Get-Process -Name *a* - выполняем команду "Get-Process" с параметром "-Name" и значением "*a*" Get-Process | Sort-Object -Property Name - передаем список процессов в "Sort-Object" с параметром "-Property" и значением "Name" () - вход конвейера dir C:\Windows\ | Sort-Object -Property Length -Descending Sort-Object -Property Length -Descending -InputObject (dir c:\windows) Get-Service | Format-Wide Format-Wide -InputObject (Get-Service) Get-Help Get-Service -Full Get-Service -Name *win* "*win*" | Get-Service -ComputerName - в powershell всегда указывает на удаленный ПК (для работы должен быть включен winrm, у пользователя должны быть права Администратора на удаленном ПК) Get-Service -ComputerName pdc | Measure-Object Get-Service -ComputerName ts | Measure-Object Get-Service -ComputerName pdc,ts | Sort-Object MachineName | FT -GroupBy MachineName Get-Service -ComputerName pdc,ts | Sort-Object MachineName | FT -GroupBy MachineName MachineName,Name,Status Get-Service -Name (ByValue, ByPropertyName) - ByValue - string -ComputerName (ByPropertyName) -InputObject (ByValue) - ByValue - service-controller "что то в кавычках" - для powershell это строка
Переменные
Объявление переменной Инициализация переменной Использование переменной Get-Command -Noun Variable - смотрим справка по переменным Clear-Variable Get-Variable New-Variable Remove-Variable Set-Variable New-Variable - объявление переменной Set-Variable - инициализация переменной / задать значение Get-Variable - использование значение переменной Get-Variable - без параметров покажет все доступные переменные Get-Variable -Name PSVersionTable - покажет значение переменной PSVersionTable Переменные могут быть разных типов, содержать разные данные, числа, строки Get-Variable -Name PSVersionTable | Get-Member - посмотреть что можно сделать с переменной PSVersionTable Get-Help New-Variable - показать по команде New-Variable New-Variable -Name Test - создать переменную Test New-Variable -Name Test1 - создать переменную Test1 Get-Variable - показать все переменные, и убедимся что переменная Test и Test1 создались Get-Variable -Name Test - проверим что переменная Test создалась Get-Variable -Name Test1 - проверим что переменная Test1 создалась New-Variable -Name Test2 -Value 2015 - создадим переменную Test2 и зададим для нее значение 2015 (число) Get-Variable - показать все переменные New-Variable -Name Test3 -Value "Superpuper" - создадим переменную Test3 и зададим для нее значение Superpuper (строка) Get-PSDrive - показать точки монтирования dir Env: - показать системные переменные dir Variable: - показать переменны пользователя dir Variable:\Test3 - показать значение переменной Test3 !!! Короткое обращение к переменным осуществляется с помощью символа доллар "$" $Test3 $Test2 $Test1 $Test $PSVersionTable $PSVersionTable | Get-Member - мы увидим что тип данных тут Hashtable (TypeName: System.Collections.Hashtable - сложный) $Test2 | Get-Member - мы увидим что тип данных тут Int32 (TypeName: System.Int32 - числовой) $Test3 | Get-Member - мы увидим что тип данных тут String (TypeName: System.String - строка) !!! Для использования метода в конце метода обязательно должны быть скобки"()" Пример: $переменная.GetType() !!! Для использования свойства скобок нет. Пример: $переменная.Length $Test2.GetType() - посмотреть тип используя метод (Int32) $Test3.GetType() - посмотреть тип используя метод (String) $Test3.Length - посмотреть свойство Length переменной $Test3, получим количество символов в строке $Test3.Substring(2, 7) - применить метод Substring(), обрезать значение переменной первые два символа и начиная с 7 символа получим $Test3.Substring(0, 7) - применить метод Substring(), обрезать значение переменной начиная с 7 символа $Test3.Substring(3) - применить метод Substring(), обрезать значение переменной первые три символа $Test4 = 100 - простое объявление переменной, задали значение равное 100 $Test4.GetType() - посмотреть тип используя метод, Int32 $Test4 = 100.25 - простое объявление переменной, задали значение равное 100.25 $Test4.GetType() - посмотреть тип используя метод, стало Double $Test4 = "xxx xxx xxx xxxx xxx" - простое объявление переменной, задали значение равное строке "xxx xxx xxx xxxx xxx" $Test4.GetType() - посмотреть тип используя метод, стало String Get-PSDrive - показать точки монтирования dir Variable:\Test? - показать значение переменной Test? Test1,Test2, Test3... [int]$Test5 = 100 - объявление переменной, тип данных int, значение 100 $Test5 - посмотрели значение переменной, равно 100 $Test5.GetType() - посмотреть тип используя метод, тип данных int $Test5 = 100.25 - команда выполнится, но запишется значение равное 100, так как ранее тип данных был объявлен ([int]$Test5) $Test5.GetType() - убедимся что тип данных не изменился $Test5 = "eewewew-123" - команда не выполнится и вернет ошибку, так как ранее тип данных был объявлен ([int]$Test5) $Test5 = "11213" - попробуем задать вот такую строку состоящею из цифр, powershell увидел что в строке цифры и добавил значение переменной $Test5.GetType() - убедимся что тип данных не изменился Использование переменных [int]$Test6 = 3 - объявили переменную $Test6, тип данных int, значение переменной равно 3 $Test6 = убедились что значение переменной Test6 равно 3 dir C:\Windows | Select-Object -First 3 - посмотрим в каталоге первые три файла dir C:\Windows | Select-Object -First $Test6 - посмотрим в каталоге первые файлы используя переменную $Test6 $Test6 = 15 - переназначили значение переменной Test6 dir C:\Windows | Select-Object -First $Test6 - посмотрим в каталоге первые файлы используя переменную $Test6 Пример скрипта поиска большого файла по размеру и подсчета количества символов в нем [string]$test8 = dir C:\Windows | Where-Object -FilterScript {$_.Extension -Like ".exe" -and $_.Name -like "h*" -and $_.Length -ge 100000 } | select -Property Name $Test9 = $test8.Substring(7) $Test10 = $test9.TrimEnd(".exe}") $Test10.Length Пример в одну строку dir C:\Windows | Where-Object -FilterScript {$_.Extension -Like ".exe" -and $_.Name -like "h*" -and $_.Length -ge 100000 } | select -Property Name | foreach {($_.Name.TrimEnd(".exe")).Length}
Массивы \ Словари
$Test7 = 10, 20, 30, 40, 50 - создать массив dir Variable:\test? - посмотреть значение массива $Test7[0] - показать первое значение массива $Test7[2] - показать третье значение массива $Test7[$Test7.Count -1] - показать последнее значение массива $Test7[-1] - показать последнее значение массива $Test7.Count - показать количество значений в массиве $Test7[2].GetType() $Test7.GetType() $srvlist = Get-Service - создать массив вывода команды Get-Servivce $srvlist - показать все значение массива $srvlist[0] - показать первое значение массива $srvlist[4] - показать пятое значение массива $srvlist[10] - показать десятое значение массива $srvlist[10].Status - посмотреть свойства Status значение [10] массива $srvlist[10].Status.ToString().Length - посмотреть свойство Status,применить метод ToString() - превратить вывод в строку, посмотреть свойство - количество символов $srvlist[10].Name.ToString().Length - посмотреть свойство Name, применить метод ToString() - превратить вывод в строку, посмотреть свойство - количество символов $ldw = dir C:\Windows - создать массив команды dir C:\Windows $ldw - посмотреть содержимое массива $ldw[7].BaseName.ToString() $ldw[7].BaseName.ToString().Length $MyFolder = "C:" $MyFiles = Dir $MyFolder $MyFiles.Count
Программные конструкции \ Программирование Powershell
Программирование: 1. Переменные + массивы 2. Циклы while do ... while do ... until for 4. Переборы ForEach 5. Условие if if ... else if ... ifelse ... else Пример цикла while [int]$Index = 8 while ($Index -GT 0) # Условие продолжения цикла { $Index; # Полезная нагрузка в цикле $Index = $Index -1; } Пример цикла do while [int]$Index = 8 Do { $Index; # Полезная нагрузка в цикле $Index = $Index -1; } while ($Index -GT 0) # Условие продолжения цикла Пример цикла do Until [int]$Index = 8 Do { $Index; # Полезная нагрузка в цикле $Index = $Index -1; } Until ($Index -GT 0) # Условие окончания цикла Пример цикла For cls For ( [int]$Index = 8; # Выполняется один раз при входе в цикл $Index -GT 0; # Условие продолжения цикла $Index = $Index -1 # Выполняется после каждого повторения ) { $Index # Полезная нагрузка } Пример цикла For cls [int]$Index = 8 For ( [int]$ForIndex = $Index; # Выполняется один раз при входе в цикл $ForIndex -GT 0; # Условие продолжения цикла $ForIndex = $ForIndex -1 # Выполняется после каждого повторения ) { $ForIndex # Полезная нагрузка } Цикл For, пример бреда, введение в переборы cls $srvl = Get-Service for ( [int]$i = 0; $i -LT $srvl.Count; $i = $i + 1 ) { $srvl[$i].Name } Перебор ForEach cls $srv = Get-Service ForEach ($s in $srv) { $s.Name } Цикл IF cls [int]$Test9 =5 $Test9 if ($Test9 -GT 3) { Write-Host "Больше трех" } Цикл IF ELSE cls [int]$Test9 =2 $Test9 if ($Test9 -GT 3) { Write-Host "Больше трех" } else { Write-Host "Не больше трех" } Цикл IF ELSEIF ELSE cls [int]$Test9 = Get-Random -Maximum 5 -Minimum -5 $Test9 if ($Test9 -GT 4) { Write-Host "число больше 4" } elseif ($Test9 -GT 3) { Write-Host "число больше 3" } elseif ($Test9 -GT 0) { Write-Host "больше 0" } else { Write-Host "число отрицательное" } Пример цикла cls #Показать название каталога в корневой папке диска c:, в котором больше всего вложенных каталогов. $Rootc = dir "c:\" -directory # Это массив папок верхнего уровня. Будем их перебирать $MaxCount = 0 #Тут будем запоминать максимальное найденное число $FName = "" # Тут будем запоминать название папки с максимальным числом подкаталогов foreach ($F in $Rootc) # Перебираем все каталоги верхнего уровня { $SubF = Dir -Directory $F.FullName # Получаем список вложенных папок if ($SubF.count -gt $MaxCount) # Сравниваем число подпапок в текущем каталоге с папкой-лидером { # Если найден новый лидер, запоминаем его $MaxCount = $SubF.count; # Число подкаталогов у нового лидера $MaxName = $F.FullName # Имя лидера } } $MaxName # После перебора всех папок показываем лидера
Сценарии \ запуск сценариев \ настройка политики запуска
*.PS1 - расширение скриптов powershell Get-Command -Noun ExecutionPolicy - смотри на доступные команды управления безопасностью выполнения powershell скриптов Get-ExecutionPolicy - показать политику запуска powershell скриптов Возможны следующие значения: "Unrestricted, RemoteSigned, AllSigned, Restricted, Default, Bypass, Undefined". Restricted - включена по умолчанию, запуск сценариев запрещен Unrestricted - разрешен запуск всех сценариев Get-ExecutionPolicy -List - показать все доступные политики Set-ExecutionPolicy - изменить настройки политики Set-ExecutionPolicy Unrestricted - разрешить запуск всех сценариев Set-ExecutionPolicy Restricted - запретить запуск всех сценариев
Пример сценария
$RootFolderDir = "c:\" # В этой папке будем искать cls #Показать название каталога в корневой папке диска c:, в котором больше всего вложенных каталогов. $Rootc = dir $RootFolderDir -directory # Это массив папок верхнего уровня. Будем их перебирать $MaxCount = 0 #Тут будем запоминать максимальное найденное число $FName = "" # Тут будем запоминать название папки с максимальным числом подкаталогов foreach ($F in $Rootc) # Перебираем все каталоги верхнего уровня { $SubF = Dir -Directory $F.FullName # Получаем список вложенных папок if ($SubF.count -gt $MaxCount) # Сравниваем число подпапок в текущем каталоге с папкой-лидером { # Если найден новый лидер, запоминаем его $MaxCount = $SubF.count; # Число подкаталогов у нового лидера $MaxName = $F.FullName # Имя лидера } } $MaxName # После перебора всех папок показываем лидера
Сценарии \ параметры сценариев
Параметры в сценарии задаются функцией param() Используются параметры вот так: .\myscript.ps1 "c:\" .\myscript.ps1 -RootFolderDir "c:\" .\myscript.ps1 -RootFolderDir "c:\Program*" .\myscript.ps1 -RootFolderDir "c:\" -Ext "exe" .\myscript.ps1 -RootFolderDir "c:\Windows" -Ext "exe" .\myscript.ps1 -RootFolderDir "c:\Windows" -Ext "log" .\myscript.ps1 -RootFolderDir "c:\Windows" -Ext "dll" .\myscript.ps1 -RootFolderDir "c:\Windows" -Ext "txt"
Пример сценария с простыми параметрами параметрами:
param( [string]$RootFolderDir, [string]$Ext ) #$RootFolderDir = "c:\" # В этой папке будем искать # перенесли в параметр #Показать название каталога папке $RootFolderDir, в котором больше всего файлов с расширение $Ext $Rootc = dir $RootFolderDir -directory # Это массив папок верхнего уровня. Будем их перебирать $MaxCount = 0 #Тут будем запоминать максимальное найденное число $FName = "" # Тут будем запоминать название папки с максимальным числом подкаталогов foreach ($F in $Rootc) # Перебираем все каталоги верхнего уровня { $SubF = Dir -Directory ($F.FullName + "\*." + $Ext) # Получаем список вложенных файлов if ($SubF.count -gt $MaxCount) # Сравниваем число подпапок в текущем каталоге с папкой-лидером { # Если найден новый лидер, запоминаем его $MaxCount = $SubF.count; # Число подкаталогов у нового лидера $MaxName = $F.FullName # Имя лидера } } $MaxName # После перебора всех папок показываем лидера
Пример сценария со сложными параметрами:
[CmdletBinding()] # Включение режима сложных параметров param( [Parameter(Mandatory=$true)] # действует для одного следующего параметра #Mandatory - обязательный параметр или нет [string]$RootFolderDir, [string]$Ext = "*" # задали значение по умолчанию # значения по умолчанию можно задать и в простом сценарии ) Write-Host ("Каталог: " + $RootFolderDir) Write-Host ("Расширение: " + $Ext) #Показать название каталога папке $RootFolderDir, в котором больше всего файлов с расширение $Ext $Rootc = dir $RootFolderDir -directory # Это массив папок верхнего уровня. Будем их перебирать $MaxCount = 0 #Тут будем запоминать максимальное найденное число $FName = "" # Тут будем запоминать название папки с максимальным числом подкаталогов foreach ($F in $Rootc) # Перебираем все каталоги верхнего уровня { $SubF = Dir -Directory ($F.FullName + "\*." + $Ext) # Получаем список вложенных файлов if ($SubF.count -gt $MaxCount) # Сравниваем число подпапок в текущем каталоге с папкой-лидером { # Если найден новый лидер, запоминаем его $MaxCount = $SubF.count; # Число подкаталогов у нового лидера $MaxName = $F.FullName # Имя лидера } } Write-host ("Результат: " + $MaxName) # После перебора всех папок показываем лидера
Пример сценария с параметрами
#Сценарий с параметрами, показывающий список процессов #1. Строка - фильтр для процессов #2. Число - фильтр для процессов #3. Строка - управляет сортировкой #4. Строка - управляет форматирование результата [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string]$ProcessNamez, [Parameter(Mandatory=$true)] [int]$ColProcess, [Parameter(Mandatory=$true)] [string]$SortProcess , [Parameter(Mandatory=$true)] $FormatT ) if ($ProcessName -EQ 0) { $ProcessNamez = "svc*" } elseif ($ProcessNamez -EQ 1) { $ProcessNamez = "chr*" } else { $ProcessNamez = "idle*" } if ( $SortProcess -EQ 0) { $SortProcess = "CPU*" } elseif ($ProcessName -EQ 1) { $SortProcess = "WS*" } else { $SortProcess = "ID" } if ( $FormatT -EQ 0) { $FormatT = "ID" } else { $FormatT = "ProcessName" } Get-Process -Name $ProcessNamez | Select-Object -First $ColProcess | Sort-Object $SortProcess | Format-Table $FormatT Write-Host "$ProcessNamez" Write-Host "$ColProcess" Write-Host "$SortProcess" Write-host "$FormatT"
Сценарий, используем перебор ForEach, для создания объектов
param ( [string]$FRoot = ".", #Где создаем папки [string]$FNEw = "zxc" #Имя папки ) # Для заданной папки создать в каждой из ее подпапок вложенную папку с названием "zxc" $Dir = Dir $FRoot -Directory ForEach($F in $Dir) { New-Item -name $FNEw -ItemType Directory -Path $F.FullName }
Конвейер, используем перебор ForEach с методом CreateSubdirectory, для создания объектов
param ( [string]$FRoot = ".", #Где создаем папки [string]$FNEw = "zxc" #Имя папки ) # Для заданной папки создать в каждой из ее подпапок вложенную папку с названием "zxc" Dir $FRoot -Directory | ForEach-Object CreateSubdirectory $FNEw
Обработка ошибок в powershell
Обработка ошибок: on error resume next v------------------- if (... <> 0) v------------------- if (...) v------------------- if (...) v------------------- Обработка исключений: Try { Код } Catch { #обработака ошибок }
Обработка ошибок, пример сценария с обработкой ошибок:
[int]$A = 0 Try { $A + 1 $A * 2 10 /$A $A - 1 Write-Host "Ошибок не было" } Catch { Write-Host "Случилась ошибка!" }
Обработка ошибок, Write сообщения
Get-Command -Verb write - подробная информация по глаголу write Write-FileSystemCache Write-DtcTransactionsTraceSession Write-PrinterNfcTag Write-VolumeCache Write-Debug Write-DfsrHealthReport Write-DfsrPropagationReport Write-Error Write-EventLog Write-Host Write-Information Write-Output Write-Progress Write-Verbose Write-Warning
Обработка ошибок, пример использования Write-Verbose, Write-Debug
#s3.ps1 -A 1 -B 2 -Verbose #s3.ps1 -A 1 -B 2 -Verbose -Debug #.\s3.ps1 -A 2 -B 3 -Verbose #.\s3.ps1 -A 2 -B 3 -C -Verbose [CmdletBinding()] # Оснащает сценарий дополнительными функциями как Verbose и Debug Param ( [int]$A, [int]$B, [switch]$C # Параметр в виде ключей, ключ без значения ) cls #Write-Host ("Параметр A=" + $A) #Write-Host ("Параметр B=" + $B) Write-Verbose ("Параметр A=" + $A) $A | Get-Member | Write-Debug Write-Verbose ("Параметр B=" + $B) $B | Get-Member | Write-Debug Write-Verbose ("Параметр C=" + $C) #$C | Get-Member | Write-Debug
Обработка ошибок, пример использования «Switch» в сценарии
# pingovator [CmdletBinding()] Param ( [switch]$A, [switch]$B, [switch]$C ) $ip_list = @('192.168.15.1', '192.168.15.10', '192.168.15.254') #$ip_list = "192.168.15.1", "192.168.15.10", "192.168.15.254" Try { if ([switch]$A) { # Выполняется если A = True Write-Host ($ip_list[0]) #ping ($ip_list[0]) Test-Connection ($ip_list[0]) Write-Host "Ошибок не было!" } elseif ([switch]$B) { # Выполняется если B = True Write-Host ($ip_list[1]) Test-Connection ($ip_list[1]) Write-Host "Ошибок не было!" } elseif ([switch]$C) { # Выполняется если C = True Write-Host ($ip_list[2]) Test-Connection ($ip_list[2]) Write-Host "Ошибок не было!" } else { Write-Host "Параметры не указаны" Write-Host ("Параметр A = " + $A) Write-Host ("Параметр B = " + $B) Write-Host ("Параметр C = " + $C) } #EndTry } Catch { Write-Host "О Ужас у нас ошибки" }
Обработка ошибок, встроенная переменная $Error
#cls [int]$A = 0 Try { $A + 1 $A * 2 10 / $A $A - 1 Write-Host "Ошибок не было" } Catch { # Write-Host "Случилась ошибка!" # Write-Error "Случилась ошибка!" Write-Warning "Случилась ошибка!" #$Error | GM #$Error.ErrorDetails #$Error.CategoryInfo }
Удаленное управление \ удаленное исполнение команд
Подготовка компьютера к удаленному управлению. winrm QuickConfig - подготовка компьютера к удаленному управлению. Enable-PSRemoting -Force - подготовка компьютера к удаленному управлению. 0. запустится служба WinRM (если запущена перезапустится) 1. служба WinRM перейдет в состояние — автоматический запуск при старте 2. будет создано правило в firewall для WinRM для HTTP трафика на порту 5985 для всех локальных IP адресов Удаленное управление варианты 1. -ComputerName - специальный параметр для исполнения команд на удаленном ПК 2. PSsession - удаленное управление на основе PSSesion, подходит для подключения к одному пк 3. Invoke-Command - специальная команда для выполнения команд на большом кол-ве компьютеров winrs –r:computer01 cmd - удаленное управление computer01 с помощью WinRS / оболочка cmd winrs -r:win10-test1 powershell - удаленное управление win10-test1 с помощью WinRS / оболочка powershell Как пользоваться -ComputerName: Get-Service -ComputerName win10-test1 - используя параметр -ComputerName получаем информацию о сервисах с компьютера win10-test1 Использование PSSession Enter-PSSession win10-test1 - подключаемся к удаленному ПК Exit-PSSession - завершить удаленную сессию Get-Command -Noun PSSession - список всех возможных команд с использованием PSSession Использование Invoke-Command Invoke-Command pdc1, win10-test1, win10-test2 -ScriptBlock {Get-Service; Get-Process} Invoke-Command win10-test1 -ScriptBlock {Get-Process} Invoke-Command win10-test1,ts,pdc -ScriptBlock {dir c:\} Invoke-Command win10-test1,ts,pdc -ScriptBlock {dir c:\ |Measure-Object}
Фоновое исполнение команд
Get-Command -Noun Job - получаем информацию по командам Job Get-Job - получить список заданий Receive-Job - это команда поможет узнать результат выполнения задания Remove-Job - удалить задание Resume-Job - возобновить выполнение задания Start-Job - запуск задания Stop-Job - остановка задания Suspend-Job - поставить задание на паузу Wait-Job - притормозить задание Start-Job {dir c:\ -Recurse | Measure-Object} Start-Job -ScriptBlock {dir c:\ -Recurse | Measure-Object} Start-Job {Get-Service} Get-Job - показать все задания, заодно ид заданий Receive-Job 1 - посмотреть результат выполнения задания c id 1 Receive-Job 3 - посмотреть результат выполнения задания c id 3 Пример использования задания: Start-Job {Get-Service} - создали задание Get-Job - получить список заданий $srv = Receive-Job -id 5 - сохранили результат выполнения в переменную $srv | Select-Object -Property Status, Name | Sort-Object status - выполнили полезную работу с переменной
Планировщик в powershell \ назначенные задания
Get-Command -Noun *Job Get-Command -Noun ScheduledJob taskschd.msc Get-Help Set-ScheduledJob Get-Help Set-ScheduledJob -Examples Get-Help Set-ScheduledJob -online
Модули / подготовка
0. Создадим файл script1.ps1: [CmdletBinding()] Param( [Parameter(Mandatory=$True)] [string]$Filename ) Get-Content -Path $Filename 2. Создадим файл zxc.txt и добавим в него контент "Hello man": New-Item zxc.txt -Type File Set-Content "Hello man" -Path .\zxc.txt 3. Проверим работу скрипта из пункта 0 .\script1.ps1 -Filename .\zxc.txt
Модули / создание функции
Редактируем скрипт script1.ps1 Функцию можно назвать как угодно, но лучше придерживается общепринятому в powershell синтаксису Глагол-Существительное. В нашем случае назовём ее Get-MyInfo Function Get-MyInfo { [CmdletBinding()] Param( [Parameter(Mandatory=$True)] [string]$Filename ) Get-Content -Path $Filename } ###### вызов функции (все еще редактируем файл script1.ps1) Get-MyInfo -Filename .\zxc.txt
Модули / добавляем еще функций
Function Get-MyInfo { [CmdletBinding()] Param( [Parameter(Mandatory=$True)] [string]$Filename ) Get-Content -Path $Filename } Function Set-MyInfo { [CmdletBinding()] Param( [Parameter(Mandatory=$True)] [string]$Filename, [Parameter(Mandatory=$True)] [string]$MyText ) Set-Content $MyText -Path $Filename #$MyText | Out-File -FilePath $Filename } Function Clear-MyInfo { [CmdletBinding()] Param( [Parameter(Mandatory=$True)] [string]$Filename ) Remove-Item -Path $Filename } # Используем функции Set-MyInfo -Filename .\zxc.txt -MyText "Halololo lalalala lolo" # создаем файл и записываем текст Get-MyInfo -Filename .\zxc.txt # Читаем файл Clear-MyInfo -Filename .\zxc.txt # Удаляем файл
Модули / Сохранение и создание своего модуля
0. Файлы модулей имеют расширение *.psm1 1. Директория модулей для пользователя по умолчанию: C:\Users\NAME_USER\Documents\WindowsPowerShell\Modules 2. !!! У модуля должна быть своя директория. !!! Модуль и директория имеют одинаковое имя. Пример: C:\Users\NAME_USER\Documents\WindowsPowerShell\Modules\NAMEMODULE_FOLDER\NAMEMODULE.psm1 C:\Users\user\Documents\WindowsPowerShell\Modules\script1\script1.psm1 3. Директория модулей для системы по умолчанию: C:\Program Files\WindowsPowerShell\Modules C:\Windows\system32\WindowsPowerShell\v1.0\Modules C:\Program Files\Microsoft Message Analyzer\PowerShell\ 4. Посмотреть все директории где могут быть модули: dir Env:\PS* | FL 5. Показать все доступные модули в powershell: Get-Module -ListAvailable 6. Посмотреть справку по модулю: Get-Command -Module Name_Module Get-Command -Noun Name_Function Get-Command -Module Script* Get-Command -Noun MyInfo
Модули и справка для функции:
Function NAME-FUNCTION { <# .Synopsis что то здесь .Description что то тут .Parameter Start Описание параметра Start .Parameter End Описание параметра End .Example Пример #> #полезное тело функции }
wmi \ cim
WMI - позволяет получить информацию о железе CIM замена WMI Get-Command -Noun WmiObject Get-Command -Noun Wmi* Get-Command -Noun CimInstance Get-Command -Noun Cim* Get-CimInstance 'Win32_Bios' | Select-Object SerialNumber - получить серийный номер ПК (работает на брендовых устройствах) Get-WmiObject win32_computersystem | Select-Object SystemSKUNumber - получить серийный номер ПК (работает на брендовых устройствах) Get-WmiObject Win32_Bios - показать версию Bios Get-WmiObject Win32_BaseBoard - показать материнскую плату Get-WmiObject Win32_IDEcontroler - показать контролер дисков Get-WmiObject win32_PhysicalMemory - показать информацию об оперативке RAM Get-WmiObject Win32_Processor - информация о процессоре CPU Get-WmiObject Win32_USBController - показать информацию об USB Get-WmiObject Win32_USBControllerDevice - показать информацию об USB Get-WmiObject Win32_USBHub - показать информацию об USB Get-WmiObject Win32_DiskDrive - показать информацию о дисках Get-WmiObject Win32_Printer - показать информацию о принтерах Get-WmiObject Win32_DesktopMonitor - показать информацию о мониторе по умолчанию Get-WmiObject Win32_VideoController - показать информацию о видеокарте GPU Get-WmiObject Win32_NetworkAdapter - показать информацию о сетевых картах NET !!! При использовании Get-CimInstance отлично работает автодобавление (клавиша TAB) Get-Help Get-CimInstance -Examples Get-CimInstance Win32_BaseBoard - показать материнскую плату Get-CimInstance Win32_Bios - показать версию Bios Get-CimInstance Win32_Processor - информация о процессоре CPU
AD
Стандартные cmd программы для управления AD: dsadd /? - добавить объект dsget /? - посмотреть информацию о объекте dsmod /? - изменить существующий объект dsmove /? - переместить объект dsquery /? - посмотреть объекты, возвращает список dsrm /? - удалить объект CN - объект либо встроенная папка OU - подразделение Пользователь "zxc" находится в OU "home" в домене "domen.inc" Читается с права на лево: CN=zxc,OU=home,DC=domen,DC=inc OU home: OU=home,DC=domen,DC=inc Используем powershell: Update-Help - обновляем справку Get-Command -Module ActiveDirectory - показать доступные команды для работы с ActiveDirectory help New-ADUser -Examples - смотрим справку по New-ADUser Import-Module ActiveDirectory - импортируем модуль ActiveDirectory (решает проблему с powershell, доступ к точке монтирования AD) Get-PSProvider - показать доступные провайдеры (провайдер ActiveDirectory должен быть в списке, если его нет то следует выполнить Import-Module ActiveDirectory) Get-PSDrive - показать точки монтирования (точка монтирования "AD ... //RootDSE/" должна быть в списке, если её нет то следует выполнить Import-Module ActiveDirectory) dir AD: cd AD: cd "DC=vazaraz,DC=inc" перейти в домен "vazaraz.inc" cd "OU=vazaraz-pc" - перейти OU "vazaraz-pc" dir -Recurse - показать все вложенные объекты Get-ADUser "CN=vasya,OU=manager,DC=vazaraz,DC=inc" - показать информацию о пользователе vasya, в домене "azaraz.inc", каталог OU "manager" dir -Recurse | Sort-Object -Property objectclass | Where-Object -Property ObjectClass -eq "user" - показать всех пользователей dir -Recurse | Sort-Object -Property objectclass | Where-Object -Property ObjectClass -eq "computer" - показать все компьютеры dir -Recurse | Sort-Object -Property objectclass | Where-Object -Property ObjectClass -eq "group" - показать все группы Get-Item "CN=WIN10-TEST0" Get-Item "CN=wds" Get-Item "CN=wds" | Get-Member dir | Select-Object name, objectGuid New-ADOrganizationalUnit LOLOLOLO - создать OU с именем "LOLOLOLO"