Как держать всегда под рукой любимые скрипты
Полезные советы
- Fors1k
- Администратор
- Сообщения: 57
- Зарегистрирован: 08 июн 2021, 17:23
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
Re: Полезные советы
Как передать большое количество параметров в команду одной "пачкой" (PowerShell Splatting)
Так будет выглядеть вызов команды поиска цвета, записанный обычным способом
Wake up, Neo, select all
$color = New-Color (53, 121, 185)
$handle = (Get-Process -id $pid).MainWindowHandle
$pos = Find-Color -Color $color -Handle $handle -StartPos 0, 0 -Size 100, 100 -Deviation 12 -Count 1
$pos.location
А сейчас зададим параметры отдельно, используя powershell Splatting:
Wake up, Neo, select all
$find = @{
Color = New-Color (53, 121, 185)
Handle = (Get-Process -id $pid).MainWindowHandle
StartPos = 0, 0
Size = 100, 100
Deviation = 12
Count = 1
}
Теперь вызов команды будет выглядеть очень лаконично
Wake up, Neo, select all
$pos = Find-Color @find
$pos.location
При таком способе весьма читабельно выглядит декларирование параметров.
Также будет удобно вызывать команду с разными наборами параметров несколько раз.
Можно в начале скрипта задать несколько
наборов параметров $find1 = @{...} ; $find2 = @{...}
,
и затем в нужном месте вызывать команду, указывая определенный
набор параметров Find-Color @find1 ; Find-Color @find2
- Fors1k
- Администратор
- Сообщения: 57
- Зарегистрирован: 08 июн 2021, 17:23
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
Re: Полезные советы
Операторы &
и .
Оператор .
запускает ScriptBlock в текущей области, в то время как оператор &
запускает ScriptBlock в дочерней области.
Wake up, Neo, select all
.{
$var1 = "test"
}
&{
$var2 = "test"
}
Write-Host "var1 = $var1"
Write-Host "var2 = $var2"
Output
var1 = test var2 =
- Fors1k
- Администратор
- Сообщения: 57
- Зарегистрирован: 08 июн 2021, 17:23
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
Re: Полезные советы
Найти файл по его содержимому
Есть папка с кучей текстовых файлов, и нам понадобилось найти один из них.
Все, что мы о нем помним - где-то в тексте присутствует слово "gold".
Как найти "иголку в стоге сена"? Решить эту задачу через PowerShell нам поможет всего одна строка кода.
Укажем путь, фильтр по типу файлов, и что будем искать, а в результат выберем
путь к файлу, и номер строки, где обнаружилось совпадение:
Wake up, Neo, select all
Select-String "gold" "D:\files\*.txt"|Select Path , LineNumber
Output
Path LineNumber ---- ---------- D:\files\qwe.txt 4
Re: Полезные советы
Поиск изображения в невидимом окне
Этот пример показывает как скрыть окно с экрана, при этом скрипт будет искать в этом окне изображение и выполнять клик мышкой. Пользователь может использовать пк, это не повлияет на работу скрипта. Не все окна воспринимают эмуляцию кликов поэтому такой способ работает не всегда.
Wake up, Neo, select all
Clear-Host
try{
$img = Get-Image -Path "C:\menu.bmp" # загрузить изображение
}
catch{
Write-Host "Картинка не загрузилась" -ForegroundColor Red
Stop-Script
}
$window = Find-Window -Title "Warspear Online" # поиск окна с именем Warspear Online
if(!$window){
Write-Host "Окно не найдено" -ForegroundColor Red
Stop-Script
}
Set-WindowTransparency 0 -Handle $window.handle[0] # сделать окно невидимым
Start-Sleep 1 # пауза 1 секунду (можно убрать если не нужна)
$coord = Find-Image $img -Handle $window.handle[0] -Accuracy 90 -Deviation 10 # поиск изображения в окне
if($coord){ # если найдено
Write-Host "Координаты картинки: $($coord.location[0])" -ForegroundColor Green
Click-Mouse $coord.location[0] -Handle $window.handle[0] -Event # клик на картинку, курсор при этом не задействован
}
else{
Write-Host "Картинка не найдена" -ForegroundColor Red
}
Set-WindowTransparency 255 -Handle $window.handle[0] # сделать окно видимым
- Fors1k
- Администратор
- Сообщения: 57
- Зарегистрирован: 08 июн 2021, 17:23
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
Re: Полезные советы
Получить внешний IP адрес компьютера
Через PowerShell получить публичный IP адрес компьютера можно всего одной строкой кода:
Wake up, Neo, select all
$myIP = (IRM api.myip.com).IP
Write-Host $myIP
- Fors1k
- Администратор
- Сообщения: 57
- Зарегистрирован: 08 июн 2021, 17:23
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
Re: Полезные советы
Получить результат с определенным шансом
Получить случайное число или объект из массива можно через Get-Random.
А для получения чего-либо с определенной вероятностью можно воспользоваться следующей функцией:
Wake up, Neo, select all
function Get-WithChance($Chance){
(Get-Random -Minimum 1.0 -Maximum 101) -le $Chance
}
Запросить результат с вероятностью успеха 30%:
Wake up, Neo, select all
Get-WithChance 30
Проверим верно ли производится вычисление, выполнив запрос 200 раз:
Wake up, Neo, select all
$tests = 200
(1..$tests|Where{Get-WithChance 30}).Count * 100 / $tests
#29.8
Ну и пример использования на условном коде казино, в котором шанс выигрыша 30%:
Wake up, Neo, select all
if(Get-WithChance 30){
Write-Host 'Вы выиграли 100$' -Fore Green
}
else{
Write-Host "Попробуйте еще раз" -Fore Red
}
Кто сейчас на конференции
Сейчас этот форум просматривают: Michaildbm и 1 гость