==================================================================================== === Получение доступа к содержимому файла с его последующим выводом в консоль: === ==================================================================================== # write-host ${%file%} ==================================================================================== === Открытие текущего каталога в explorer'e: === ==================================================================================== # ii . ==================================================================================== === Проверка текущей установленной политики, отвечающей за запуск скриптов: === ==================================================================================== # get-executionpolicy ==================================================================================== === Получение списка com-объектов: === ==================================================================================== # gci HKLM:SoftwareClasses -ea 0| ? {$_.PSChildName -match ‘^w+.w+$' -and (gp "$($_.PSPath)CLSID" -ea 0)} | ft PSChildName ==================================================================================== === Запуск com-объекта. Создание переменной для сохранения нового com-объекта: === ==================================================================================== # $ie = New-Object -ComObject InternetExplorer.Application; $ie.visible=$true ==================================================================================== === Чтобы назначить псевдоним команде с параметрами нужно создать функцию: === ==================================================================================== # function my_func {set-location c:windowssystem32} set-alias go my_func go ==================================================================================== === В общем случае в псевдониме ForEach может указываться не один блок команд, а три. Начальный и конечный выполняются единожды: ==================================================================================== # ls *.txt | foreach {$l = 0} {$l += $_.length} {write-host $l} ==================================================================================== === Если при использовании switch нужно ограничиться только одним совпадением, то следует применить инструкцию break: === ==================================================================================== # $a = 3 switch ($a) { 1 ("One") 2 ("Two") 3 ("Three"; Break} 4 {"Four"} 3 {"Once more three"} } Three ==================================================================================== === Вставка даты в имя файла: === ==================================================================================== # $file = "c:$(Get-Date -format ‘d-MM-yyyy').txt" gps > $file ==================================================================================== === Проверка данных, введенных в качестве стандартных ($args) параметров функции: === ==================================================================================== # function My_func ([switch] $recurse) { if ($args -eq "test") } ==================================================================================== === Первая конструкция выполняется в 3.074 раза быстрее второй. Это справедливо как минимум для больших чисел: === ==================================================================================== # function sum {$n = 0 foreach ($i in $input) {$n += $i} $n} vs function sum2 {$n = 0 while ($input.movenext()) {$n += $input.current} $n} ==================================================================================== === Обращение к исключению, которое вызвало ошибку (выбор элемента из массива ошибок и обращение к одному из свойств): === ==================================================================================== # $error[0].exception == Не удается найти путь "C:\fail", так как он не существует. == ==================================================================================== === Создание документа в Word и вывод текста на экран: === ==================================================================================== # $word = New-Object -ComObject word.application $word_window = $word.documents.add() $word.visible = $true $sel = $word.selection $sel.font.size = 14 $sel.font.bold = $true $sel.typetext("Hey, how you doing?") $word_window.saveas(".test.doc") $word.Quit() ==================================================================================== === Выбор нужных строк из результата выполнения командлета: === ==================================================================================== # get-wmiobject win32_service | gm | ? {$_.membertype -eq "scriptmethod"} ==================================================================================== === Создание формы, запускающей Word: === ==================================================================================== # [void][system.reflection.assembly]::loadwithpartialname("system.windows.forms") $form.text = "First form" $button = new-object windows.forms.button $button.text = "Press it!" $button.dock = "fill" $button.add_click({$word = new-object -comobject word.application; $word.visible = $true}) $form.controls.add($button) $form.add_shown({$form.activate()}) $form.showdialog() ==================================================================================== === Отображение каталогов, находящихся в текущей директории: === ==================================================================================== # ls | ? {$_.psiscontainer} ==================================================================================== === Определение размера текущего каталога: === ==================================================================================== # ls -recurse | measure-object -property length -sum ==================================================================================== === Создание каталога/файла, в качестве названия которого используется текущая дата: === ==================================================================================== # new-item -path c:ps_test -name "$(get-date -uformat ‘%d.%m.%Y')" -type "directory" new-item -name "$(get-date -uformat ‘%d.%m.%Y').txt" -type "file" -value "newtext" ==================================================================================== === Переименование группы файлов: === ==================================================================================== # ls *.tmp | foreach-object{ $arr = $_.name.split("."); $newname = $arr[0] + ".new"; ren $_.fullname $newname -passthru; } ==================================================================================== === Определение библиотек, используемых процессом powershell.exe: === ==================================================================================== # ps powershell | select -expandproperty modules | ft ==================================================================================== === Запуск нового процесса с подтверждением: === ==================================================================================== # ii C:WINDOWSsystem32calc.exe -confirm $a = ([wmiclass] "win32_process").create("calc.exe") ==================================================================================== === Работа с реестром: === ==================================================================================== == Большинство операций выполняются с помощью командлетов *-item и *-itemproperty. == ==================================================================================== === Фильтр событий, занесенных в журнал: === ==================================================================================== # get-eventlog -logname application | ? {$_.timegenerated.date -eq (get-date -year 2011 -month 2 -day 2).date} ==================================================================================== === Отправка e-mail: === ==================================================================================== # $sender = "test@example.com" $recipient = "test1@example.com" $subject = "Some header1" $body = "Some body1" $smtp = New-Object System.Net.Mail.SmtpClient("smtp.example.com"); $smtp.Credentials = New-Object System.Net.NetworkCredential("login", "pass"); $smtp.Send($sender, $recipient, $subject, $body) ==================================================================================== === SendKeys на примере калькулятора: === ==================================================================================== # $shell = New-Object -ComObject wscript.shell $calc = $shell.Exec("calc") Start-Sleep 1 if ($shell.AppActivate($calc.ProcessID)) { $shell.SendKeys("2{+}") Start-Sleep 1 $shell.SendKeys("3") Start-Sleep 1 $shell.SendKeys("~") Start-Sleep 1 $shell.SendKeys("^c"); } [Void]$shell.Popup("Closing", 1, "Ok.", 0) if ($shell.AppActivate($calc.ProcessID)) { Start-Sleep 1 $shell.SendKeys("%{F4}") } $n = $shell.Exec("notepad") Start-Sleep 1 if ($shell.AppActivate($n.ProcessID)) { $shell.SendKeys("2 {+} 3 = ") $shell.SendKeys("^v") $shell.SendKeys(" {(}c{)} Calculator") } ==================================================================================== === Новые процессы: === ==================================================================================== # Get-Process | Where-Object { try { (New-Timespan $_.StartTime).TotalMinutes -le 10} catch { $false } } ==================================================================================== === Список устройств: === ==================================================================================== # [System.ServiceProcess.ServiceController]::GetDevices() ==================================================================================== === Поиск по каталогу файлов, удовлетворяющим заданный шаблон: === ==================================================================================== # Get-ChildItem -Path C:Windows -Include *.dll -Recurse -Exclude [a-y]*.dll ==================================================================================== === Пути в массив можно подставлять беспроблемно: === ==================================================================================== # $a = "c:\Clips" $b = "c:\Tempps_test_old" $c = "c:\Tempmusic" $address_arrays = $a, $b, $c ls $address_arrays[2] -Recurse ==================================================================================== === Автоматический запуск .ps1-файлов (но это лучше никогда не делать, а то я тебе нос сломаю): === ==================================================================================== # FType microsoft.powershellscript.1=%windir%system32windowspowershellv1.0powershell.exe "&'%1'%*" ==================================================================================== === Вызов функции вместо повторной записи кода: === ==================================================================================== # function syslog {get-eventlog -logname system} ==================================================================================== === Особенности инкремента: === ==================================================================================== # $a = 0 $b = 1,2 $c = -1,-2 $b[$a] = $c[$a++] $b 1 -1 == В этом примере выражение $a++ вычисляется до выражения $c[$a++]. При вычислении $a++ значение переменной $a изменяется. Переменная $a в выражении $b[$a] равняет 1, а не 0, поэтому оператор назначает значение $b[1], а не $b[0]. == ==================================================================================== === Работа с массивами: === ==================================================================================== Отрицательные величины обозначают отсчет с конца массива. Например, индекс "-1" относится к последнему элементу массива. Чтобы отобразить три последние элемента массива, нужно ввести: # $a[-3..-1] ==================================================================================== === Logoff с удаленного ПК: === ==================================================================================== # (gwmi Win32_OperatingSystem).Win32Shutdown(0) ==================================================================================== === Добавление данных в файл. Нужно писать -path, иначе какая-то херня с кодировкой: === ==================================================================================== # Add-content -path "e:\1.txt" -value (get-content "e:\2.txt") ==================================================================================== === Просмотр свойств WMI-классов на удаленном компьютере: === ==================================================================================== # (gwmi Win32_ComputerSystem -computername 192.168.53.3).username ==================================================================================== === Смена каталога по умолчанию при запуске cmd: === ==================================================================================== # HKEY_LOCAL_MACHINESoftwareMicrosoftCommand Processor Autorun->cd /d "whatever_path" ==================================================================================== === Перенаправление ошибок в стандартный вывод (здесь &1, судя по всему, файл, который выбран в качестве стандартного вывода, а 2 – идентификатор ошибок): === ==================================================================================== # chkdsk /r > diskerrors.txt 2>&1 Если нужно перенаправление в другой файл, то: # chkdsk /r 2 > diskerrors.txt ==================================================================================== === Для добавления скрипта в планировщик нужно указать следующую строку: === ==================================================================================== # C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noprofile -command &{"E:temp\psdate.ps1"} ==================================================================================== === Переименование элементов для их отображения в нужном формате: === ==================================================================================== # Import-CSV c:new-users.csv | Select @{Name="Surname";Expression={$_."Last Name"}} ==================================================================================== === Работа с хэш-коллекциями: === ==================================================================================== == формат записи: @{…}, например $hash = @{"server1" = "testserver1"; "server2" = "testserver2"} == == вывод значения, созданного с помощью хэш-коллекции: ls $env:SystemRoot | Select-Object Name,Lastwritetime,@{Name='Day';Expression={$_.LastWriteTime.DayOfWeek}}) == ==================================================================================== === Пример с округлением дробных значений до сотых: === ==================================================================================== # $OS=Get-WmiObject -class win32_operatingsystem -property Caption,CSDVersion $Drives=Get-WmiObject -class win32_logicaldisk -filter "DriveType = 3" Write-Host "Operating System:" $OS.Caption $OS.CSDVersion Write-Host "Drive Summary:" Write-Host "Drive"`t"Size (MB)"`t"FreeSpace (MB)" foreach ($d in $Drives) { $free="{0:N2}" -f ($d.FreeSpace/1MB -as [int]) $size="{0:N0}" -f ($d.size/1MB -as [int]) Write-Host $d.deviceID `t $size `t $free } ==================================================================================== === Изменение ключа реестра в данном кусте: === ==================================================================================== # Set-ItemProperty -Path . -PSProperty DontPrettyPath -Value 1 ==================================================================================== === Передать в pssession значение инициализированной переменной: === ==================================================================================== == Использовать директиву "$using:". Например: == # $testvar = "test" echo "$using:testvar" ==================================================================================== === Создать задачу в планировщике, используя xml-шаблон: === ==================================================================================== # Register-ScheduledTask -Xml (Get-Content job1.xml | out-string) -TaskName job1 -User username ==================================================================================== === Скачать набор инструментов или chrome_latest: === ==================================================================================== # Invoke-WebRequest "https://github.com/Sergey1000/tools/raw/master/tools.zip" -OutFile "$env:HOMEPATH\Desktop\tools.zip" # Invoke-WebRequest "https://dl.google.com/chrome/install/latest/chrome_installer.exe" -OutFile "$env:HOMEPATH\desktop\chrome.exe" ==================================================================================== === Распаковать архив: === ==================================================================================== # Expand-Archive -LiteralPath "$env:HOMEPATH\Desktop\test.zip" -DestinationPath "$env:HOMEPATH\Desktop\" ==================================================================================== === Получить данные Azure Webapp Publishing Profile: === ==================================================================================== # $publishing_profile = [xml](Get-AzWebAppPublishingProfile -ResourceGroupName $rg_name -Name "$webapp_name") $username = (Select-Xml -Xml $publishing_profile -XPath "//publishData/publishProfile[contains(@profileName,'Web Deploy')]/@userName").Node.Value $password = (Select-Xml -Xml $publishing_profile -XPath "//publishData/publishProfile[contains(@profileName,'Web Deploy')]/@userPWD").Node.Value ==================================================================================== === Получить токен для авторизации в Azure (curl-версия): === ==================================================================================== # curl -X POST -d 'grant_type=client_credentials&client_id=$APP_ID&client_secret=$APP_ID_SECRET&resource=https%3A%2F%2Fmanagement.azure.com%2F' https://login.microsoftonline.com/$TENANT_ID/oauth2/token ==================================================================================== === Авторизоваться в Azure токеном (curl-версия): === ==================================================================================== # curl -X GET -H "Authorization: Bearer $TOKEN" "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Consumption/usageDetails?$filter=properties%2FusageStart%20ge%20%272021-04-10%27%20and%20properties%2FusageEnd%20le%20%272021-04-11%27%20and%20properties%2FresourceGroup%20eq%20%27rg1%27&$top=1000&api-version=2021-01-01" ==================================================================================== === Получить токен для авторизации в Azure (powershell-версия): === ==================================================================================== # $body = "grant_type=client_credentials&client_id=$app_id&client_secret=$client_secret&resource=https://management.azure.com/" $bearer_token = Invoke-RestMethod -Method Post -body $body -Uri https://login.microsoftonline.com/$tenant_id/oauth2/token ==================================================================================== === Получить информацию из Azure, авторизовавшись токеном (powershell-версия): === ==================================================================================== # $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add("Authorization", "Bearer $($bearer_token.access_token)") $headers.Add("Content-Type", "application/json") Invoke-RestMethod -Method Get -Headers $headers -Uri "https://management.azure.com/subscriptions/$subscription_id/providers/Microsoft.Consumption/usageDetails?$filter=properties%2FusageStart%20ge%20%272021-04-10%27%20and%20properties%2FusageEnd%20le%20%272021-04-11%27%20and%20properties%2FresourceGroup%20eq%20%27rg1%27&$top=1000&api-version=2021-01-01" ==================================================================================== === Использовать части URL для именования чего-то: === ==================================================================================== # foreach ($i in $(Get-Content urls.txt)) { $name = $i.Split("://") $first_part = $name[1].Split(".")[0] $last_part = $name[1].Split(".")[-1] } ==================================================================================== === Как работать с индексами элементов из Get-Content: === ==================================================================================== # [string[]]$arrayFromFile = Get-Content "1.txt" foreach ($i in $arrayFromFile){ echo $arrayFromFile.IndexOf($i) } ==================================================================================== === Выполнить команду на удаленном сервере через invoke-command: === ==================================================================================== # $username = "user" $passwd = ConvertTo-SecureString "password" -AsPlainText -Force $pscredential = New-Object System.Management.Automation.PSCredential($username, $passwd) $s = New-PSSession -ComputerName "1.1.1.1" -Credential $pscredential Invoke-Command -Session $s -ScriptBlock { start-ScheduledTask -TaskName "task1"} ==================================================================================== === Как создать файл с рандомным содержимым (аналог перенаправления из /dev/random): === ==================================================================================== # fsutil.exe file createnew 39.bin 39000000 == Это создаст файл 39.bin размером в 39000000 байт. == ==================================================================================== === Как скопировать ssh-ключ на удаленную машину (аналог ssh-copy-id) и создать алиас для подключения по ssh: === ==================================================================================== # type $env:USERPROFILE\.ssh\id_rsa.pub | ssh user@1.1.1.1 "cat >> ~/.ssh/authorized_keys" == Добавить алиас для подключения: == # notepad $PROFILE function sshaliasrandomname {ssh user@1.1.1.1} ==================================================================================== === Как получить предыдущий день в формате MM-dd-yyyy === ==================================================================================== # (Get-Date).AddDays(-1).ToString('MM-dd-yyyy') ==================================================================================== === Скачать файлы из Azure Storage с помощью Powershell в GUI: === ==================================================================================== == Если вдруг появилась необходимость использовать GUI, нарисованное в Powershell, а в нем вдруг нужно скачать файл из Blob Storage, то можно нарваться на бесконечный процесс загрузки, какой доходит до 100% без завершения. Пофиксить это можно, запустив процесс загрузки файла с ключом "AsJob" и проверять, закончилась джоба или нет. Дикость, но вот так: == # Get-AzStorageBlobContent -Context $storage_context -Container $container_name -Blob $blob_name -Destination $path -Force -AsJob $job1 = Get-Job | Where-Object Command -eq "Get-AzStorageBlobContent" $is_job_finished = $false While ($is_job_finished -ne $true) { [System.Windows.Forms.Application]::DoEvents() if ($job1.State -ne "Completed") { Start-Sleep -Seconds 1 } else { $is_job_finished = $true } } ==================================================================================== === Создать дефолтный nuget.config и поставить nuget-пакет: === ==================================================================================== == Создать скелет nuget.config == # == Добавить nuget-источник: == # dotnet nuget add source --name nuget.org https://api.nuget.org/v3/index.json --configfile "C:\Users\user\AppData\Roaming\NuGet\default\nuget.config" == Добавить пакет: == # dotnet tool install --global package_name --configfile "C:\Users\user\AppData\Roaming\NuGet\default\nuget.config" ==================================================================================== === Сохранить найденную по паттерну строку в переменную: === ==================================================================================== # $var = Get-Content -Path "somefile.txt" | Where-Object {$_ -match "rev-parse.*"} | Foreach {$Matches[0]} ==================================================================================== === Пинговать сервис через tcp: === ==================================================================================== # tcpping sqlserver.database.windows.net:1433 ==================================================================================== === Использовать Invoke-Sqlcmd с переменными: === ==================================================================================== # $var1 = 'Test1' $var2 = 'Test2' $sql = "Insert into table(col1, col2) values ('$var1', '$var2')" Invoke-sqlcmd -Query $sql -ServerInstance server -Database db ==================================================================================== === Переименовать файлы с помощью exiftool: === ==================================================================================== # exiftool -d 'VID_%Y%m%d_%H%M%S.%%e' '-filename ==================================================================================== === Сохранить имя бранча и хэш коммита в переменной для использования в качестве тэга в AWS: ==================================================================================== # $Env:COMMIT_HASH = git rev-parse --short HEAD $Env:BRANCH_NAME = git branch --show-current $Env:BRANCH_AND_COMMIT_TAG = 'branch_=_' + $Env:BRANCH_NAME + '__' + 'commit_hash_=_' + $Env:COMMIT_HASH # aws cloudformation describe-stacks | grep -e "LastUpdatedTime" -e "StackName" -e "branch_=" aws cloudformation describe-stacks | select-string "LastUpdatedTime", "StackName", "branch_="