====================================================================================
=== Получение доступа к содержимому файла с его последующим выводом в консоль: ===
====================================================================================
#
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_="