diff --git a/README.md b/README.md index 4e1cfd7..5d1d956 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,6 @@ [➡️ Веб-версия](https://lifailon.github.io/) -[WinForms](https://github.com/Lifailon/PS-Commands/blob/rsa/WinForms/WinForms-Test-Stend.ps1) (тестовый стенд с примерами) - 📢 Habr: [PowerShell и его возможности](https://habr.com/ru/articles/782592/) - [Help](#help) @@ -18,7 +16,9 @@ - [npp](#npp) - [Regex](#regex) - [DataType](#datatype) +- [Module](#module) - [Bit](#bit) +- [Cycle](#cycle) - [Files](#files) - [Credential](#credential) - [WinEvent](#winevent) @@ -97,13 +97,16 @@ - [Git](#git) - [DSC](#dsc) - [Ansible](#ansible) +- [Win_Modules](#win_modules) - [GigaChat](#GigaChat) - [YandexGPT](#YandexGPT) - [SuperAGI](#superagi) - [Replicate](#replicate) +- [Google-Filter](#google-filter) - [Google-API](#google-api) - [RapidAPI](#rapidapi) - [TMDB](#tmdb) +- [OMDb](#omdb) - [ivi](#ivi) - [Kinopoisk](#kinopoisk) - [VideoCDN](#videocdn) @@ -111,8 +114,8 @@ - [Discord](#discord) - [oh-my-posh](#oh-my-posh) - [Pester](#pester) -- [FFmpeg](#ffmpeg) - [Pandoc](#pandoc) +- [FFmpeg](#ffmpeg) - [ImageMagick](#imagemagick) # Help @@ -332,12 +335,71 @@ $(foreach ($Group in $Groups) { $Group.Group[0] }) | Format-Table ``` +### Error + +`$Error` выводит все ошибки текущего сеанса \ +`$Error[0].InvocationInfo` развернутый отчет об ошибке \ +`$Error.clear()` \ +`$LASTEXITCODE` результат выполнения последней команды (0 - успех) \ +`exit 1` код завершения, который возвращается $LASTEXITCODE + +### Property + +`$srv.Count` кол-во элементов в массиве \ +`$srv.Length` содержит количество символом строки переменной [string] или количество значений (строк) объекта \ +`$srv.Chars(2)` отобразить 3-й символ в строке \ +`$srv[2]` отобразить 3-ю строку в массиве + +### Method + +`$srv.Insert(0,"https://")` добавить значение перед первым символом \ +`$srv.Substring(4)` удалить (из всего массива) первые 4 символа \ +`$srv.Remove(3)` удалить из всего массива все после 3 символа \ +`$string = "123"` создать строку \ +`$int = [convert]::ToInt32($string)` преобразовать строку в тип данных число \ +`[string]::Concat($text,$num)` объеденить переменные в одну строку \ +`[string]::Join(":",$text,$num)` объеденить используя разделитель \ +`[string]::Compare($text,$num,$true)` выдает 0 при совпадении или 1/-1 при несовпадении, $true (без учета регистра) или $false (с учетом регистра) \ +`[string]::Equals($text,$num)` производит сравнение двух строк и выдает $true при их совпадении или $false при несовпадении \ +`[string]::IsNullOrEmpty($text)` проверяет наличие строки, если строка пуста $true, если нет $false \ +`[string]::IsNullOrWhiteSpace($text2)` проверяет на наличие только символов пробел, табуляция или символ новой строки + +### DateTime + +`Get-TimeZone` часовой пояс \ +`[DateTime]::UtcNow` время в формате UTC 0 \ +`(Get-Date).AddHours(-3)` \ +`$Date = (Get-Date -Format "dd/MM/yyyy hh:mm:ss")` \ +`$Date = Get-Date -f "dd/MM/yyyy"` получаем тип данных [string] \ +`[DateTime]$gDate = Get-Date "$Date"` преобразовать в тип [DateTime] \ +`[int32]$days=($fDate-$gDate).Days` получить разницу в днях \ +`"5/7/07" -as [DateTime]` преобразовать входные данные в тип данных [DateTime] \ +`New-TimeSpan -Start $VBRRP.CreationTimeUTC -End $VBRRP.CompletionTimeUTC` получить разницу во времени + +### Measure-Command + +`(Measure-Command {ping ya.ru}).TotalSeconds` узнать только время выполнения \ +`(Get-History)[-1] | select @{Name="RunTime"; Expression={$_.EndExecutionTime - $_.StartExecutionTime}},ExecutionStatus,CommandLine` посчитать время работы последней [-1] (select -Last 1) выполненной команды и узнать ее статус + +### Timer + +`$start_time = Get-Date` зафиксировать время до выполнения команды \ +`$end_time = Get-Date` зафиксировать время по завершению \ +`$time = $end_time - $start_time` высчитать время работы скрипта \ +`$min = $time.minutes` \ +`$sec = $time.seconds` \ +`Write-Host "$min минут $sec секунд"` \ +`$timer = [System.Diagnostics.Stopwatch]::StartNew()` запустить таймер \ +`$timer.IsRunning` статус работы таймера \ +`$timer.Elapsed.TotalSeconds` отобразить время с момента запуска (в секундах) \ +`$timer.Stop()` остановить таймер + # npp `pwsh -NoExit -ExecutionPolicy Unrestricted -WindowStyle Maximized -File "$(FULL_CURRENT_PATH)"` -`%AppData%\Notepad++` themes/shortcuts.xml -``` +`%AppData%\Notepad++` themes/shortcuts.xml \ +```xml @@ -550,31 +612,79 @@ foreach ($p in $gp) { `[Char]` cимвол Юникода (16-разрядный) \ `$char = $srv.ToCharArray()` разбить строку [string] на массив [System.Array] из букв \ +# Module + +### psd1 +```PowerShell +@{ + RootModule = "Get-Function.psm1" + ModuleVersion = "0.1" + Author = "Lifailon" + CompanyName = "Open Source Community" + Copyright = "Apache-2.0" + Description = "Function example" + PowerShellVersion = "7.2" + PrivateData = @{ + PSData = @{ + Tags = @("Function","Example") + ProjectUri = "https://github.com/Lifailon/PS-Commands" + LicenseUri = "https://github.com/Lifailon/Console-Translate/blob/rsa/LICENSE" + ReleaseNotes = "Second release" + } + } +} +``` +### psm1 +```PowerShell +function Get-Function { + <# + .SYNOPSIS + Описание + .DESCRIPTION + Описание + .LINK + https://github.com/Lifailon/PS-Commands + #> + param ( + [Parameter(Mandatory,ValueFromPipeline)][string]$Text, + [ValidateSet("Test1","Test2")][string]$Provider = "Test1", + [ValidateRange(1,3)][int]$Number = 2, + [Switch]$Switch + ) + Write-Host Param Text: $Text + Write-Host Param Provider: $Provider + Write-Host Param Number: $Number + Write-Host Param Switch: $Switch +} +``` +`Get-Function Test` + ### Switch ```PowerShell $MMM = Get-Date -UFormat "%m" switch($MMM) { -"01" {$Month = 'Jan'} -"02" {$Month = 'Feb'} -"03" {$Month = 'Mar'} -"04" {$Month = 'Apr'} -"05" {$Month = 'May'} -"06" {$Month = 'Jun'} -"07" {$Month = 'Jul'} -"08" {$Month = 'Aug'} -"09" {$Month = 'Sep'} -"10" {$Month = 'Oct'} -"11" {$Month = 'Nov'} -"12" {$Month = 'Dec'} + "01" {$Month = 'Jan'} + "02" {$Month = 'Feb'} + "03" {$Month = 'Mar'} + "04" {$Month = 'Apr'} + "05" {$Month = 'May'} + "06" {$Month = 'Jun'} + "07" {$Month = 'Jul'} + "08" {$Month = 'Aug'} + "09" {$Month = 'Sep'} + "10" {$Month = 'Oct'} + "11" {$Month = 'Nov'} + "12" {$Month = 'Dec'} } ``` ### function switch ```PowerShell Function fun-switch ( -[switch]$param + [switch]$param ) { -If ($param) {"yes"} else {"no"} + If ($param) {"yes"} else {"no"} } + fun-switch -param ``` # Bit @@ -687,53 +797,10 @@ function ConvertFrom-Bit { `(Get-Process pwsh).ProcessorAffinity = 61440` 1111000000000000 присвоить 4 последних ядра \ `(Get-Process pwsh).ProcessorAffinity = (ConvertFrom-Bit 1111000000000000)` -### Property -`$srv.Count` кол-во элементов в массиве \ -`$srv.Length` содержит количество символом строки переменной [string] или количество значений (строк) объекта \ -`$srv.Chars(2)` отобразить 3-й символ в строке \ -`$srv[2]` отобразить 3-ю строку в массиве - -### Method -`$srv.Insert(0,"https://")` добавить значение перед первым символом \ -`$srv.Substring(4)` удалить (из всего массива) первые 4 символа \ -`$srv.Remove(3)` удалить из всего массива все после 3 символа \ -`$string = "123"` создать строку \ -`$int = [convert]::ToInt32($string)` преобразовать строку в тип данных число \ -`[string]::Concat($text,$num)` объеденить переменные в одну строку \ -`[string]::Join(":",$text,$num)` объеденить используя разделитель \ -`[string]::Compare($text,$num,$true)` выдает 0 при совпадении или 1/-1 при несовпадении, $true (без учета регистра) или $false (с учетом регистра) \ -`[string]::Equals($text,$num)` производит сравнение двух строк и выдает $true при их совпадении или $false при несовпадении \ -`[string]::IsNullOrEmpty($text)` проверяет наличие строки, если строка пуста $true, если нет $false \ -`[string]::IsNullOrWhiteSpace($text2)` проверяет на наличие только символов пробел, табуляция или символ новой строки - -### DateTime -`Get-TimeZone` часовой пояс \ -`[DateTime]::UtcNow` время в формате UTC 0 \ -`(Get-Date).AddHours(-3)` \ -`$Date = (Get-Date -Format "dd/MM/yyyy hh:mm:ss")` \ -`$Date = Get-Date -f "dd/MM/yyyy"` получаем тип данных [string] \ -`[DateTime]$gDate = Get-Date "$Date"` преобразовать в тип [DateTime] \ -`[int32]$days=($fDate-$gDate).Days` получить разницу в днях \ -`"5/7/07" -as [DateTime]` преобразовать входные данные в тип данных [DateTime] \ -`New-TimeSpan -Start $VBRRP.CreationTimeUTC -End $VBRRP.CompletionTimeUTC` получить разницу во времени - -### Measure-Command -`(Measure-Command {ping ya.ru}).TotalSeconds` узнать только время выполнения \ -`(Get-History)[-1] | select @{Name="RunTime"; Expression={$_.EndExecutionTime - $_.StartExecutionTime}},ExecutionStatus,CommandLine` посчитать время работы последней [-1] (select -Last 1) выполненной команды и узнать ее статус - -### Timer -`$start_time = Get-Date` зафиксировать время до выполнения команды \ -`$end_time = Get-Date` зафиксировать время по завершению \ -`$time = $end_time - $start_time` высчитать время работы скрипта \ -`$min = $time.minutes` \ -`$sec = $time.seconds` \ -`Write-Host "$min минут $sec секунд"` \ -`$timer = [System.Diagnostics.Stopwatch]::StartNew()` запустить таймер \ -`$timer.IsRunning` статус работы таймера \ -`$timer.Elapsed.TotalSeconds` отобразить время с момента запуска (в секундах) \ -`$timer.Stop()` остановить таймер +# Cycle ### Foreach + `$list = 100..110` создать массив из цифр от 100 до 110 \ `foreach ($srv in $list) {ping 192.168.3.$srv -n 1 -w 50}` $srv хранит текущий элемент из $list и повторяет команду до последнего элемента в массиве \ `$foreach.Current` текущий элемент в цикле \ @@ -741,45 +808,40 @@ function ConvertFrom-Bit { `$foreach.MoveNext()` переход к следующему элементу в цикле ### ForEach-Object (%) -`100..110 | %{ping -n 1 -w 50 192.168.3.$_ > $null` \ -`if ($LastExitCode -eq 0) {Write-Host "192.168.3.$_" -ForegroundColor green` \ -`} else {` \ -`Write-Host "192.168.3.$_"-ForegroundColor Red}}` \ -`%` передать цикл через конвеер (ForEach-Object) \ -`$_` переменная цикла и конвеера ($PSItem) \ -`gwmi Win32_QuickFixEngineering | where {$_.InstalledOn.ToString() -match "2022"} | %{($_.HotFixID.Substring(2))}` gwmi создает массив, вывод команды передается where для поиска подходящих под критерии объектов. По конвееру передается в цикл для удаления первых (2) символов методом Substring из всех объектов HotFixID. - +```PowerShell +100..110 | %{ping -n 1 -w 50 192.168.3.$_ > $null +if ($LastExitCode -eq 0) {Write-Host "192.168.3.$_" -ForegroundColor green +} else { +Write-Host "192.168.3.$_"-ForegroundColor Red}} +% # передать цикл через конвеер (ForEach-Object) +$_ # переменная цикла и конвеера ($PSItem) +gwmi Win32_QuickFixEngineering | where {$_.InstalledOn.ToString() -match "2022"} | %{($_.HotFixID.Substring(2))} # gwmi создает массив, вывод команды передается where для поиска подходящих под критерии объектов. По конвееру передается в цикл для удаления первых (2) символов методом Substring из всех объектов HotFixID. +``` ### While -`$srv = "yandex.ru"` \ -`$out2 = "Есть пинг"` \ -`$out3 = "Нет пинга"` \ -`$out = $false`` предварительно сбросить переменную, While проверяет условие до запуска цикла \ -`While ($out -eq $false){`` пока условие является $true, цикл будет повторяться \ -`$out = ping -n 1 -w 50 $srv` \ -`if ($out -match "ttl") {$out = $true; $out2} else {$out = $false; $out3; sleep 1}` \ -`}` - -`while ($True){`` запустить бесконечный цикл \ -`$result = ping yandex.ru -n 1 -w 50` \ -`if ($result -match "TTL"){`` условие, при котором будет выполнен break \ -`Write-Host "Сайт доступен"` \ -`break`` остановит цикл \ -`} else {Write-Host "Сайт недоступен"; sleep 1}` \ -`}` +```PowerShell +$srv = "yandex.ru" +$out2 = "Есть пинг" +$out3 = "Нет пинга" +$out = $false # предварительно сбросить переменную, While проверяет условие до запуска цикла +While ($out -eq $false){ # пока условие является $true, цикл будет повторяться +$out = ping -n 1 -w 50 $srv +if ($out -match "ttl") {$out = $true; $out2} else {$out = $false; $out3; sleep 1} +} +while ($True){ # запустить бесконечный цикл +$result = ping yandex.ru -n 1 -w 50 +if ($result -match "TTL"){ # условие, при котором будет выполнен break +Write-Host "Сайт доступен" +break # остановит цикл +} else {Write-Host "Сайт недоступен"; sleep 1} +} +``` ### Try-Catch-Finally ```PowerShell Try {$out = pping 192.168.3.1} Catch {Write-Warning "$($error[0])"} # выводит в случае ошибки (вместо ошибки) finally {$out = "End"} # выполняется в конце в любом случае ``` -### Error -`$Error` выводит все ошибки текущего сеанса \ -`$Error[0].InvocationInfo` развернутый отчет об ошибке \ -`$Error.clear()` \ -`$LASTEXITCODE` результат выполнения последней команды (0 - успех) \ -`exit 1` код завершения, который возвращается $LASTEXITCODE - # Files `$file = [System.IO.File]::Create("$home\desktop\test.txt")` создать файл \ @@ -791,6 +853,7 @@ finally {$out = "End"} # выполняется в конце в любом сл `$file.ReadToEnd()` прочитать файл целиком ### Read/Write Bytes + `$file = [io.file]::ReadAllBytes("$home\desktop\powershell.jpg")` метод открывает двоичный файл, считывает его в массив байт и закрывает файл \ `[io.file]::WriteAllBytes("$home\desktop\tloztotk-2.jpg",$file)` сохранить байты в файл (можно использовать для выгрузки двоичных файлов из БД) @@ -838,7 +901,7 @@ foreach ($l in $ls) { # Credential -`$Cred = Get-Credential` сохраняет креды в переменные $Cred.Username и $Cred.Password \ +`$Cred = Get-Credential` сохраняет креды в переменные `$Cred.Username` и `$Cred.Password` \ `$Cred.GetNetworkCredential().password` извлечь пароль \ `cmdkey /generic:"TERMSRV/$srv" /user:"$username" /pass:"$password"` добавить указанные креды аудентификации на на терминальный сервер для подключения без пароля \ `mstsc /admin /v:$srv` авторизоваться \ @@ -4975,10 +5038,11 @@ Security: \ `Get-Service SNMP | Restart-Service` ### snmpwalk + `snmpwalk -v 2c -c public 192.168.3.100` \ `snmpwalk -v 2c -c public -O e 192.168.3.100` -### Modules +### SNMP Modules `Install-Module -Name SNMP` \ `Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0 -UDPport 161 -Community public` \ @@ -6074,7 +6138,7 @@ ansible_shell_type=powershell ``` `ansible-inventory --list` проверить конфигурацию (читает в формате JSON) или YAML (-y) с просмотром все применяемых переменных -# Modules +# Win_Modules `ansible us -m ping` \ `ansible win_ssh -m ping` \ @@ -6742,6 +6806,23 @@ while ($response.status -ne "succeeded") { } $response.output ``` +# Google-Filter + +`https://www.google.com/search?q=the+rookie+2018+imdb` формат url-запроса поиска с пробелами \ +`https://www.google.com/search?q=the+rookie+2018+site:imdb.com` поиск по сайту \ +`https://www.google.com/search?q=the+rookie+intitle:index.of+"last modified"+(mkv|avi)` искать страницы, на которых указано "last modified" (последние изменения), заголовок страницы через расширенный оператор поиска (все перечисленные слова должны встречаться в заголовке) содержит слово "index.of" (указывает на директорию на веб-сервере, которая содержит список файлов) и искать файлы с расширениями .mkv или (|) .avi \ +`https://www.google.com/search?q=the+rookie+2018+filetype:torrent` \ +`инструкция gopro hero 11 filetype:pdf` искать сразу документ (на странице .pdf или загрузка) \ +`"действия/глаголы, утвержденные для использования в командлетах"` искать по фразе целиком, без разбиения на отдельные слова \ +`"ягуар скорость -животное -xe -xj"` узнаем скорость Ягуара, исключаем животное и модели автомобиля \ +`"intitle:лучшие фильмы 2023"` запрос ищет страницы, заголовки (title HTML документа) которых содержат слова "лучшие", "фильмы" и "2023" (все слова должны быть в заголовке) \ +`"allintitle:лучшие фильмы 2023"` запрос ищет страницы, заголовки (title HTML документа) которых содержат слова "лучшие", "фильмы" или "2023" (одно из) \ +`"intext:telegram бот powershell"` поиск страниц, содержащих указанное ключевое слово в тексте страницы (а не только в заголовке) \ +`"inurl:lifailon"` поиск страниц, в URL которых содержится указанное ключевое слово \ +`intitle:index.of "game of thrones" mkv daterange:2010..2015` фильтрация по дате изменения, оператор позволяет задать диапазон дат в формате YYYYMMDD..YYYYMMDD \ +`intitle:index.of "game of thrones" mkv after:2015` ограничить результаты поиска файлов, измененных до (before) или после (after) указанной даты \ +`intitle:index.of "game of thrones" mkv from:2010 to:2015` фильтрация по диапазону дат + # Google-API ### Google-Translate @@ -6834,6 +6915,20 @@ $(Invoke-RestMethod -Uri $url -Method Get) # список сезонов (.seaso (Invoke-RestMethod -Uri "https://api.themoviedb.org/3/tv/$id/season/2?api_key=$Token" -Method Get).episodes # вывести 2 сезон Invoke-RestMethod -Uri "https://api.themoviedb.org/3/tv/$id/season/2/episode/8?api_key=$Token" -Method Get # вывести 8 эпизод ``` +# OMDb + +Получение API ключа по [email](https://www.omdbapi.com) + +`$API_KEY = "XXXXXXXX"` \ +`$IMDb_ID = "tt7587890"` \ +`curl -s "https://omdbapi.com/?apikey=$($API_KEY)&i=$($IMDb_ID)" | jq .` \ +`curl -s "https://omdbapi.com/?apikey=$($API_KEY)&i=$($IMDb_ID)" | ConvertFrom-Json` \ +`Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&s=The Rookie"` \ +`Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&t=The Rookie"` поиск по Title \ +`Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&t=The Rookie&y=1990"` поиск по Title и году выхода \ +`Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&t=The Rookie&type=movie"` поиск только фильма (movie) или сериала (series) \ +`$(Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&s=The Rookie").Search` поиск всех совпадений (фильмы и сериалы) + # ivi [ivi api doc](https://ask.ivi.ru/knowledge-bases/10/articles/51697-dokumentatsiya-dlya-api-ivi) @@ -6853,7 +6948,7 @@ Invoke-RestMethod -Uri "https://api.themoviedb.org/3/tv/$id/season/2/episode/8?a ```Bash id=5106881 get=$(curl -s https://www.kinopoisk.ru/film/$id/episodes/) -printf "%s\n" "${get[@]}" | grep -A 1 "Сезон 2" | grep "эпизодов" | sed -r "s/^.+\: //" # количество эпиздовод во втором сезоне (8) +printf "%s\n" "${get[@]}" | grep -A 1 "Сезон 2" | grep "эпизодов" | sed -r "s/^.+\: //" # количество эпиздовод во втором сезоне ``` ### kinopoisk.dev @@ -6943,6 +7038,31 @@ percent-decode() { } percent-decode "%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA" ``` +### KinopoiskApiUnofficial + +Бесплатно 500 запросов в сутки. [Swagger documentation](https://kinopoiskapiunofficial.tech/documentation/api) +```PowerShell +API_KEY="828ec96a-f45d-4e3d-84b1-XXXXXXXXXXXX" +$headers = @{ + "accept" = "application/json" + "X-API-KEY" = "$API_KEY" +} +Invoke-RestMethod -Uri 'https://kinopoiskapiunofficial.tech/api/v2.2/films/1142153' -Headers $headers +``` +`curl -s "https://kinopoiskapiunofficial.tech/api/v2.2/films/1142153" -H "accept: application/json" -H "X-API-KEY: $API_KEY" | jq .` + +### Kinobox + +`$url = "https://www.kinopoisk.ru/film/694051"` \ +`$kp_id = $url -replace ".+/"` \ +`https://kinomix.web.app/#694051` \ +`curl -s -X GET "https://kinobox.tv/api/players/main?kinopoisk=$kp_id" -H "accept: application/json"` поиск по id Кинопоиск \ +`curl -s -X GET "https://kinobox.tv/api/players/main?imdb=tt2293640" -H "accept: application/json"` поиск по id IMDb \ +`curl -s -X GET "https://kinobox.tv/api/players/main?title=minions" -H "accept: application/json"` поиск основных плееров по названию \ +`curl -s -X GET "https://kinobox.tv/api/players/all?title=minions" -H "accept: application/json"` поиск всех плееров \ +`curl -s -X GET "https://kinobox.tv/api/popular/films" -H "accept: application/json"` популярные фильмы \ +`curl -s -X GET "https://kinobox.tv/api/popular/series" -H "accept: application/json"` популярные сериалы + # VideoCDN [API](https://github.com/notssh/videocdn-api) \ @@ -7277,26 +7397,6 @@ Describe "Get-RunningProcess" { } } ``` -# FFmpeg -```PowerShell -$release_latest = Invoke-RestMethod "https://api.github.com/repos/BtbN/FFmpeg-Builds/releases/latest" -$url = $($release_latest.assets | Where-Object name -match "ffmpeg-master-latest-win64-gpl.zip").browser_download_url -Invoke-RestMethod $url -OutFile $home\Downloads\ffmpeg-master-latest-win64-gpl.zip -Expand-Archive -Path "$home\Downloads\ffmpeg-master-latest-win64-gpl.zip" -DestinationPath "$home\Downloads\" -Copy-Item -Path "$home\Downloads\ffmpeg-master-latest-win64-gpl\bin\ffmpeg.exe" -Destination "C:\Windows\System32\ffmpeg.exe" -Remove-Item "$home\Downloads\ffmpeg-*" -Force -Recurse -``` -`ffmpeg -i input.mp4 output.gif` конвертировать mp4 в gif \ -`ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" output.gif` изменить разрешение на выходе \ -`ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" -r 10 output.gif` изменить количество кадров в секунду на выходе \ -`ffmpeg -i input.mp4 -filter_complex "fps=5,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=32[p];[s1][p]paletteuse=dither=bayer" output.gif` сжатие за счет цветовой политры \ -`ffmpeg -i input.mp4 -ss 00:00:10 -frames:v 1 -q:v 1 output.jpg` вытащить скриншот из видео на 10 секунде \ -`ffmpeg -i input.mp4 -ss 00:00:05 -to 00:00:10 -c copy output.mp4` вытащить кусок видео \ -`ffmpeg -i "%d.jpeg" -framerate 2 -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4` создать видео из фото (1.jpeg, 2.jpeg и т.д.) с framerate (частотой кадров) в создаваемом видео 2 кадра в секунду \ -`ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental output.mp4` запись без перекодирования (copy) RTSP-потока с камеры видеонаблюдения (+ аудио в кодеке AAC) в файл \ -`ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental -movflags +faststart+frag_keyframe+empty_moov output.mp4` переместить метаданные в начало файла, что позволяет начать воспроизведение файла в видеоплеере до его полной загрузки \ -`ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -frames:v 1 -c:v mjpeg output.jpg` сделать скриншот - # Pandoc ```PowerShell $release_latest = Invoke-RestMethod "https://api.github.com/repos/jgm/pandoc/releases/latest" @@ -7318,6 +7418,26 @@ Import-Module ImportExcel Import-Excel -Path srv.xlsx | Export-Csv -Path $csvFilePath -NoTypeInformation -Encoding UTF8 # конвертация Excel в csv pandoc -s -f csv -t markdown input.csv -o output.md # конвертация таблицу csv в markdown ``` +# FFmpeg +```PowerShell +$release_latest = Invoke-RestMethod "https://api.github.com/repos/BtbN/FFmpeg-Builds/releases/latest" +$url = $($release_latest.assets | Where-Object name -match "ffmpeg-master-latest-win64-gpl.zip").browser_download_url +Invoke-RestMethod $url -OutFile $home\Downloads\ffmpeg-master-latest-win64-gpl.zip +Expand-Archive -Path "$home\Downloads\ffmpeg-master-latest-win64-gpl.zip" -DestinationPath "$home\Downloads\" +Copy-Item -Path "$home\Downloads\ffmpeg-master-latest-win64-gpl\bin\ffmpeg.exe" -Destination "C:\Windows\System32\ffmpeg.exe" +Remove-Item "$home\Downloads\ffmpeg-*" -Force -Recurse +``` +`ffmpeg -i input.mp4 output.gif` конвертировать mp4 в gif \ +`ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" output.gif` изменить разрешение на выходе \ +`ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" -r 10 output.gif` изменить количество кадров в секунду на выходе \ +`ffmpeg -i input.mp4 -filter_complex "fps=5,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=32[p];[s1][p]paletteuse=dither=bayer" output.gif` сжатие за счет цветовой политры \ +`ffmpeg -i input.mp4 -ss 00:00:10 -frames:v 1 -q:v 1 output.jpg` вытащить скриншот из видео на 10 секунде \ +`ffmpeg -i input.mp4 -ss 00:00:05 -to 00:00:10 -c copy output.mp4` вытащить кусок видео \ +`ffmpeg -i "%d.jpeg" -framerate 2 -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4` создать видео из фото (1.jpeg, 2.jpeg и т.д.) с framerate (частотой кадров) в создаваемом видео 2 кадра в секунду \ +`ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental output.mp4` запись без перекодирования (copy) RTSP-потока с камеры видеонаблюдения (+ аудио в кодеке AAC) в файл \ +`ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental -movflags +faststart+frag_keyframe+empty_moov output.mp4` переместить метаданные в начало файла, что позволяет начать воспроизведение файла в видеоплеере до его полной загрузки \ +`ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -frames:v 1 -c:v mjpeg output.jpg` сделать скриншот + # ImageMagick Source: [ImageMagick](https://sourceforge.net/projects/imagemagick) diff --git a/posh.txt b/posh.txt index ee987bc..23b22f5 100644 --- a/posh.txt +++ b/posh.txt @@ -7,9 +7,7 @@ GitHub Repo stars: https://img.shields.io/github/stars/Lifailon/PS-Commands Большая база заметок PowerShell на русском языке. -Веб-версия (https://lifailon.github.io/) - -WinForms - тестовый стенд с примерами (https://github.com/Lifailon/PS-Commands/blob/rsa/WinForms/WinForms-Test-Stend.ps1) +Веб-версия (https://lifailon.github.io) Habr: PowerShell и его возможности (https://habr.com/ru/articles/782592/) @@ -18,7 +16,9 @@ Habr: PowerShell и его возможности (https://habr.com/ru/articles/ # npp # Regex # DataType +# Module # Bit +# Cycle # Files # Credential # WinEvent @@ -97,13 +97,16 @@ Habr: PowerShell и его возможности (https://habr.com/ru/articles/ # Git # DSC # Ansible +# Win_Modules # GigaChat # YandexGPT # SuperAGI # Replicate +# Google-Filter # Google-API # RapidAPI # TMDB +# OMDb # ivi # Kinopoisk # VideoCDN @@ -111,8 +114,8 @@ Habr: PowerShell и его возможности (https://habr.com/ru/articles/ # Discord # oh-my-posh # Pester -# FFmpeg # Pandoc +# FFmpeg # ImageMagick # Help @@ -332,6 +335,65 @@ $(foreach ($Group in $Groups) { $Group.Group[0] }) | Format-Table +### Error + +$Error # выводит все ошибки текущего сеанса +$Error[0].InvocationInfo # развернутый отчет об ошибке +$Error.clear() +$LASTEXITCODE # результат выполнения последней команды (0 - успех) +exit 1 # код завершения, который возвращается $LASTEXITCODE + +### Property + +$srv.Count # кол-во элементов в массиве +$srv.Length # содержит количество символом строки переменной [string] или количество значений (строк) объекта +$srv.Chars(2) # отобразить 3-й символ в строке +$srv[2] # отобразить 3-ю строку в массиве + +### Method + +$srv.Insert(0,"https://") # добавить значение перед первым символом +$srv.Substring(4) # удалить (из всего массива) первые 4 символа +$srv.Remove(3) # удалить из всего массива все после 3 символа +$string = "123" # создать строку +$int = [convert]::ToInt32($string) # преобразовать строку в тип данных число +[string]::Concat($text,$num) # объеденить переменные в одну строку +[string]::Join(":",$text,$num) # объеденить используя разделитель +[string]::Compare($text,$num,$true) # выдает 0 при совпадении или 1/-1 при несовпадении, $true (без учета регистра) или $false (с учетом регистра) +[string]::Equals($text,$num) # производит сравнение двух строк и выдает $true при их совпадении или $false при несовпадении +[string]::IsNullOrEmpty($text) # проверяет наличие строки, если строка пуста $true, если нет $false +[string]::IsNullOrWhiteSpace($text2) # проверяет на наличие только символов пробел, табуляция или символ новой строки + +### DateTime + +Get-TimeZone # часовой пояс +[DateTime]::UtcNow # время в формате UTC 0 +(Get-Date).AddHours(-3) +$Date = (Get-Date -Format "dd/MM/yyyy hh:mm:ss") +$Date = Get-Date -f "dd/MM/yyyy" # получаем тип данных [string] +[DateTime]$gDate = Get-Date "$Date" # преобразовать в тип [DateTime] +[int32]$days=($fDate-$gDate).Days # получить разницу в днях +"5/7/07" -as [DateTime] # преобразовать входные данные в тип данных [DateTime] +New-TimeSpan -Start $VBRRP.CreationTimeUTC -End $VBRRP.CompletionTimeUTC # получить разницу во времени + +### Measure-Command + +(Measure-Command {ping ya.ru}).TotalSeconds # узнать только время выполнения +(Get-History)[-1] | select @{Name="RunTime"; Expression={$_.EndExecutionTime - $_.StartExecutionTime}},ExecutionStatus,CommandLine # посчитать время работы последней [-1] (select -Last 1) выполненной команды и ее узнать статус + +### Timer + +$start_time = Get-Date # зафиксировать время до выполнения команды +$end_time = Get-Date # зафиксировать время по завершению +$time = $end_time - $start_time # высчитать время работы скрипта +$min = $time.minutes +$sec = $time.seconds +Write-Host "$min минут $sec секунд" +$timer = [System.Diagnostics.Stopwatch]::StartNew() # запустить таймер +$timer.IsRunning # статус работы таймера +$timer.Elapsed.TotalSeconds # отобразить время с момента запуска (в секундах) +$timer.Stop() # остановить таймер + # npp pwsh -NoExit -ExecutionPolicy Unrestricted -WindowStyle Maximized -File "$(FULL_CURRENT_PATH)" @@ -550,31 +612,79 @@ $srv -isnot [System.Object] # проверка на несоответствие [Char] # cимвол Юникода (16-разрядный) $char = $srv.ToCharArray() # разбить строку [string] на массив [System.Array] из букв +# Module + +### psd1 + +@{ + RootModule = "Get-Function.psm1" + ModuleVersion = "0.1" + Author = "Lifailon" + CompanyName = "Open Source Community" + Copyright = "Apache-2.0" + Description = "Function example" + PowerShellVersion = "7.2" + PrivateData = @{ + PSData = @{ + Tags = @("Function","Example") + ProjectUri = "https://github.com/Lifailon/PS-Commands" + LicenseUri = "https://github.com/Lifailon/Console-Translate/blob/rsa/LICENSE" + ReleaseNotes = "Second release" + } + } +} + +### psm1 + +function Get-Function { + <# + .SYNOPSIS + Описание + .DESCRIPTION + Описание + .LINK + https://github.com/Lifailon/PS-Commands + #> + param ( + [Parameter(Mandatory,ValueFromPipeline)][string]$Text, + [ValidateSet("Test1","Test2")][string]$Provider = "Test1", + [ValidateRange(1,3)][int]$Number = 2, + [Switch]$Switch + ) + Write-Host Param Text: $Text + Write-Host Param Provider: $Provider + Write-Host Param Number: $Number + Write-Host Param Switch: $Switch +} + +Get-Function Test + ### Switch $MMM = Get-Date -UFormat "%m" switch($MMM) { -"01" {$Month = 'Jan'} -"02" {$Month = 'Feb'} -"03" {$Month = 'Mar'} -"04" {$Month = 'Apr'} -"05" {$Month = 'May'} -"06" {$Month = 'Jun'} -"07" {$Month = 'Jul'} -"08" {$Month = 'Aug'} -"09" {$Month = 'Sep'} -"10" {$Month = 'Oct'} -"11" {$Month = 'Nov'} -"12" {$Month = 'Dec'} + "01" {$Month = 'Jan'} + "02" {$Month = 'Feb'} + "03" {$Month = 'Mar'} + "04" {$Month = 'Apr'} + "05" {$Month = 'May'} + "06" {$Month = 'Jun'} + "07" {$Month = 'Jul'} + "08" {$Month = 'Aug'} + "09" {$Month = 'Sep'} + "10" {$Month = 'Oct'} + "11" {$Month = 'Nov'} + "12" {$Month = 'Dec'} } ### function switch Function fun-switch ( -[switch]$param + [switch]$param ) { -If ($param) {"yes"} else {"no"} + If ($param) {"yes"} else {"no"} } + fun-switch -param # Bit @@ -687,53 +797,10 @@ Get-Process pwsh | fl ProcessorAffinity # привязка процесса к (Get-Process pwsh).ProcessorAffinity = 61440 # 1111000000000000 присвоить 4 последних ядра (Get-Process pwsh).ProcessorAffinity = (ConvertFrom-Bit 1111000000000000) -### Property -$srv.Count # кол-во элементов в массиве -$srv.Length # содержит количество символом строки переменной [string] или количество значений (строк) объекта -$srv.Chars(2) # отобразить 3-й символ в строке -$srv[2] # отобразить 3-ю строку в массиве - -### Method -$srv.Insert(0,"https://") # добавить значение перед первым символом -$srv.Substring(4) # удалить (из всего массива) первые 4 символа -$srv.Remove(3) # удалить из всего массива все после 3 символа -$string = "123" # создать строку -$int = [convert]::ToInt32($string) # преобразовать строку в тип данных число -[string]::Concat($text,$num) # объеденить переменные в одну строку -[string]::Join(":",$text,$num) # объеденить используя разделитель -[string]::Compare($text,$num,$true) # выдает 0 при совпадении или 1/-1 при несовпадении, $true (без учета регистра) или $false (с учетом регистра) -[string]::Equals($text,$num) # производит сравнение двух строк и выдает $true при их совпадении или $false при несовпадении -[string]::IsNullOrEmpty($text) # проверяет наличие строки, если строка пуста $true, если нет $false -[string]::IsNullOrWhiteSpace($text2) # проверяет на наличие только символов пробел, табуляция или символ новой строки - -### DateTime -Get-TimeZone # часовой пояс -[DateTime]::UtcNow # время в формате UTC 0 -(Get-Date).AddHours(-3) -$Date = (Get-Date -Format "dd/MM/yyyy hh:mm:ss") -$Date = Get-Date -f "dd/MM/yyyy" # получаем тип данных [string] -[DateTime]$gDate = Get-Date "$Date" # преобразовать в тип [DateTime] -[int32]$days=($fDate-$gDate).Days # получить разницу в днях -"5/7/07" -as [DateTime] # преобразовать входные данные в тип данных [DateTime] -New-TimeSpan -Start $VBRRP.CreationTimeUTC -End $VBRRP.CompletionTimeUTC # получить разницу во времени - -### Measure-Command -(Measure-Command {ping ya.ru}).TotalSeconds # узнать только время выполнения -(Get-History)[-1] | select @{Name="RunTime"; Expression={$_.EndExecutionTime - $_.StartExecutionTime}},ExecutionStatus,CommandLine # посчитать время работы последней [-1] (select -Last 1) выполненной команды и ее узнать статус - -### Timer -$start_time = Get-Date # зафиксировать время до выполнения команды -$end_time = Get-Date # зафиксировать время по завершению -$time = $end_time - $start_time # высчитать время работы скрипта -$min = $time.minutes -$sec = $time.seconds -Write-Host "$min минут $sec секунд" -$timer = [System.Diagnostics.Stopwatch]::StartNew() # запустить таймер -$timer.IsRunning # статус работы таймера -$timer.Elapsed.TotalSeconds # отобразить время с момента запуска (в секундах) -$timer.Stop() # остановить таймер +# Cycle ### Foreach + $list = 100..110 # создать массив из цифр от 100 до 110 foreach ($srv in $list) {ping 192.168.3.$srv -n 1 -w 50} # $srv хранит текущий элемент из $list и повторяет команду до последнего элемента в массиве $foreach.Current # текущий элемент в цикле @@ -741,6 +808,7 @@ $foreach.Reset() # обнуляет итерацию, перебор начне $foreach.MoveNext() # переход к следующему элементу в цикле ### ForEach-Object (%) + 100..110 | %{ping -n 1 -w 50 192.168.3.$_ > $null if ($LastExitCode -eq 0) {Write-Host "192.168.3.$_" -ForegroundColor green } else { @@ -750,6 +818,7 @@ $_ # переменная цикла и конвеера ($PSItem) gwmi Win32_QuickFixEngineering | where {$_.InstalledOn.ToString() -match "2022"} | %{($_.HotFixID.Substring(2))} # gwmi создает массив, вывод команды передается where для поиска подходящих под критерии объектов. По конвееру передается в цикл для удаления первых (2) символов методом Substring из всех объектов HotFixID. ### While + $srv = "yandex.ru" $out2 = "Есть пинг" $out3 = "Нет пинга" @@ -773,13 +842,6 @@ Try {$out = pping 192.168.3.1} Catch {Write-Warning "$($error[0])"} # выводит в случае ошибки (вместо ошибки) finally {$out = "End"} # выполняется в конце в любом случае -### Error -$Error # выводит все ошибки текущего сеанса -$Error[0].InvocationInfo # развернутый отчет об ошибке -$Error.clear() -$LASTEXITCODE # результат выполнения последней команды (0 - успех) -exit 1 # код завершения, который возвращается $LASTEXITCODE - # Files $file = [System.IO.File]::Create("$home\desktop\test.txt") # создать файл @@ -791,6 +853,7 @@ $file.ReadLine() # построчный вывод $file.ReadToEnd() # прочитать файл целиком ### Read/Write Bytes + $file = [io.file]::ReadAllBytes("$home\desktop\powershell.jpg") # метод открывает двоичный файл, считывает его в массив байт и закрывает файл [io.file]::WriteAllBytes("$home\desktop\tloztotk-2.jpg",$file) # сохранить байты в файл (можно использовать для выгрузки двоичных файлов из БД) @@ -4975,10 +5038,11 @@ New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\ Get-Service SNMP | Restart-Service ### snmpwalk + snmpwalk -v 2c -c public 192.168.3.100 snmpwalk -v 2c -c public -O e 192.168.3.100 -### Modules +### SNMP Modules Install-Module -Name SNMP Get-SnmpData -IP 192.168.3.100 -OID 1.3.6.1.2.1.1.4.0 -UDPport 161 -Community public @@ -6074,7 +6138,7 @@ ansible_shell_type=powershell ansible-inventory --list # проверить конфигурацию (читает в формате JSON) или YAML (-y) с просмотром все применяемых переменных -# Modules +# Win_Modules ansible us -m ping ansible win_ssh -m ping @@ -6742,6 +6806,23 @@ while ($response.status -ne "succeeded") { } $response.output +# Google-Filter + +https://www.google.com/search?q=the+rookie+2018+imdb # формат url-запроса поиска с пробелами +https://www.google.com/search?q=the+rookie+2018+site:imdb.com # поиск по сайту +https://www.google.com/search?q=the+rookie+intitle:index.of+"last modified"+(mkv|avi) # искать страницы, на которых указано "last modified" (последние изменения), заголовок страницы через расширенный оператор поиска (все перечисленные слова должны встречаться в заголовке) содержит слово "index.of" (указывает на директорию на веб-сервере, которая содержит список файлов) и искать файлы с расширениями .mkv или (|) .avi +https://www.google.com/search?q=the+rookie+2018+filetype:torrent +инструкция gopro hero 11 filetype:pdf # искать сразу документ (на странице .pdf или загрузка) +"действия/глаголы, утвержденные для использования в командлетах" # искать по фразе целиком, без разбиения на отдельные слова +"ягуар скорость -животное -xe -xj" # узнаем скорость Ягуара, исключаем животное и модели автомобиля +"intitle:лучшие фильмы 2023" # запрос ищет страницы, заголовки (title HTML документа) которых содержат слова "лучшие", "фильмы" и "2023" (все слова должны быть в заголовке) +"allintitle:лучшие фильмы 2023" # запрос ищет страницы, заголовки (title HTML документа) которых содержат слова "лучшие", "фильмы" или "2023" (одно из) +"intext:telegram бот powershell" # поиск страниц, содержащих указанное ключевое слово в тексте страницы (а не только в заголовке) +"inurl:lifailon" # поиск страниц, в URL которых содержится указанное ключевое слово +intitle:index.of "game of thrones" mkv daterange:2010..2015 # фильтрация по дате изменения, оператор позволяет задать диапазон дат в формате YYYYMMDD..YYYYMMDD +intitle:index.of "game of thrones" mkv after:2015 # ограничить результаты поиска файлов, измененных до (before) или после (after) указанной даты +intitle:index.of "game of thrones" mkv from:2010 to:2015 # фильтрация по диапазону дат + # Google-API ### Google-Translate @@ -6834,6 +6915,20 @@ $(Invoke-RestMethod -Uri $url -Method Get) # список сезонов (.seaso (Invoke-RestMethod -Uri "https://api.themoviedb.org/3/tv/$id/season/2?api_key=$Token" -Method Get).episodes # вывести 2 сезон Invoke-RestMethod -Uri "https://api.themoviedb.org/3/tv/$id/season/2/episode/8?api_key=$Token" -Method Get # вывести 8 эпизод +# OMDb + +Получение API ключа по email (https://www.omdbapi.com) + +$API_KEY = "XXXXXXXX" +$IMDb_ID = "tt7587890" +curl -s "https://omdbapi.com/?apikey=$($API_KEY)&i=$($IMDb_ID)" | jq . +curl -s "https://omdbapi.com/?apikey=$($API_KEY)&i=$($IMDb_ID)" | ConvertFrom-Json +Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&s=The Rookie" +Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&t=The Rookie" # поиск по Title +Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&t=The Rookie&y=1990" # поиск по Title и году выхода +Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&t=The Rookie&type=movie" # поиск только фильма (movie) или сериала (series) +$(Invoke-RestMethod "https://omdbapi.com/?apikey=$($API_KEY)&s=The Rookie").Search # поиск всех совпадений (фильмы и сериалы) + # ivi https://ask.ivi.ru/knowledge-bases/10/articles/51697-dokumentatsiya-dlya-api-ivi @@ -6853,7 +6948,7 @@ id=$(curl -s https://api.ivi.ru/mobileapi/search/v7/?query=zimorodok | jq .resul id=5106881 get=$(curl -s https://www.kinopoisk.ru/film/$id/episodes/) -printf "%s\n" "${get[@]}" | grep -A 1 "Сезон 2" | grep "эпизодов" | sed -r "s/^.+\: //" # количество эпиздовод во втором сезоне (8) +printf "%s\n" "${get[@]}" | grep -A 1 "Сезон 2" | grep "эпизодов" | sed -r "s/^.+\: //" # количество эпиздовод во втором сезоне ### kinopoisk.dev @@ -6943,6 +7038,31 @@ percent-decode() { } percent-decode "%D0%B7%D0%B8%D0%BC%D0%BE%D1%80%D0%BE%D0%B4%D0%BE%D0%BA" +### KinopoiskApiUnofficial + +Бесплатно 500 запросов в сутки. Swagger documentation (https://kinopoiskapiunofficial.tech/documentation/api) + +API_KEY="828ec96a-f45d-4e3d-84b1-XXXXXXXXXXXX" +$headers = @{ + "accept" = "application/json" + "X-API-KEY" = "$API_KEY" +} +Invoke-RestMethod -Uri 'https://kinopoiskapiunofficial.tech/api/v2.2/films/1142153' -Headers $headers + +curl -s "https://kinopoiskapiunofficial.tech/api/v2.2/films/1142153" -H "accept: application/json" -H "X-API-KEY: $API_KEY" | jq . + +### Kinobox + +$url = "https://www.kinopoisk.ru/film/694051" +$kp_id = $url -replace ".+/" +https://kinomix.web.app/#694051 +curl -s -X GET "https://kinobox.tv/api/players/main?kinopoisk=$kp_id" -H "accept: application/json" # поиск по id Кинопоиск +curl -s -X GET "https://kinobox.tv/api/players/main?imdb=tt2293640" -H "accept: application/json" # поиск по id IMDb +curl -s -X GET "https://kinobox.tv/api/players/main?title=minions" -H "accept: application/json" # поиск основных плееров по названию +curl -s -X GET "https://kinobox.tv/api/players/all?title=minions" -H "accept: application/json" # поиск всех плееров +curl -s -X GET "https://kinobox.tv/api/popular/films" -H "accept: application/json" # популярные фильмы +curl -s -X GET "https://kinobox.tv/api/popular/series" -H "accept: application/json" # популярные сериалы + # VideoCDN https://github.com/notssh/videocdn-api @@ -7277,26 +7397,6 @@ Describe "Get-RunningProcess" { } } -# FFmpeg - -$release_latest = Invoke-RestMethod "https://api.github.com/repos/BtbN/FFmpeg-Builds/releases/latest" -$url = $($release_latest.assets | Where-Object name -match "ffmpeg-master-latest-win64-gpl.zip").browser_download_url -Invoke-RestMethod $url -OutFile $home\Downloads\ffmpeg-master-latest-win64-gpl.zip -Expand-Archive -Path "$home\Downloads\ffmpeg-master-latest-win64-gpl.zip" -DestinationPath "$home\Downloads\" -Copy-Item -Path "$home\Downloads\ffmpeg-master-latest-win64-gpl\bin\ffmpeg.exe" -Destination "C:\Windows\System32\ffmpeg.exe" -Remove-Item "$home\Downloads\ffmpeg-*" -Force -Recurse - -ffmpeg -i input.mp4 output.gif # конвертировать mp4 в gif -ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" output.gif # изменить разрешение на выходе -ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" -r 10 output.gif # изменить количество кадров в секунду на выходе -ffmpeg -i input.mp4 -filter_complex "fps=5,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=32[p];[s1][p]paletteuse=dither=bayer" output.gif # сжатие за счет цветовой политры -ffmpeg -i input.mp4 -ss 00:00:10 -frames:v 1 -q:v 1 output.jpg # вытащить скриншот из видео на 10 секунде -ffmpeg -i input.mp4 -ss 00:00:05 -to 00:00:10 -c copy output.mp4 # вытащить кусок видео -ffmpeg -i "%d.jpeg" -framerate 2 -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4 # создать видео из фото (1.jpeg, 2.jpeg и т.д.) с framerate (частотой кадров) в создаваемом видео 2 кадра в секунду -ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental output.mp4 # запись без перекодирования (copy) RTSP-потока с камеры видеонаблюдения (+ аудио в кодеке AAC) в файл -ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental -movflags +faststart+frag_keyframe+empty_moov output.mp4 # переместить метаданные в начало файла, что позволяет начать воспроизведение файла в видеоплеере до его полной загрузки -ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -frames:v 1 -c:v mjpeg output.jpg # сделать скриншот - # Pandoc $release_latest = Invoke-RestMethod "https://api.github.com/repos/jgm/pandoc/releases/latest" @@ -7318,6 +7418,26 @@ Import-Module ImportExcel Import-Excel -Path srv.xlsx | Export-Csv -Path $csvFilePath -NoTypeInformation -Encoding UTF8 # конвертация Excel в csv pandoc -s -f csv -t markdown input.csv -o output.md # конвертация таблицу csv в markdown +# FFmpeg + +$release_latest = Invoke-RestMethod "https://api.github.com/repos/BtbN/FFmpeg-Builds/releases/latest" +$url = $($release_latest.assets | Where-Object name -match "ffmpeg-master-latest-win64-gpl.zip").browser_download_url +Invoke-RestMethod $url -OutFile $home\Downloads\ffmpeg-master-latest-win64-gpl.zip +Expand-Archive -Path "$home\Downloads\ffmpeg-master-latest-win64-gpl.zip" -DestinationPath "$home\Downloads\" +Copy-Item -Path "$home\Downloads\ffmpeg-master-latest-win64-gpl\bin\ffmpeg.exe" -Destination "C:\Windows\System32\ffmpeg.exe" +Remove-Item "$home\Downloads\ffmpeg-*" -Force -Recurse + +ffmpeg -i input.mp4 output.gif # конвертировать mp4 в gif +ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" output.gif # изменить разрешение на выходе +ffmpeg -i input.mp4 -filter_complex "scale=1440:-1:flags=lanczos" -r 10 output.gif # изменить количество кадров в секунду на выходе +ffmpeg -i input.mp4 -filter_complex "fps=5,scale=960:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=32[p];[s1][p]paletteuse=dither=bayer" output.gif # сжатие за счет цветовой политры +ffmpeg -i input.mp4 -ss 00:00:10 -frames:v 1 -q:v 1 output.jpg # вытащить скриншот из видео на 10 секунде +ffmpeg -i input.mp4 -ss 00:00:05 -to 00:00:10 -c copy output.mp4 # вытащить кусок видео +ffmpeg -i "%d.jpeg" -framerate 2 -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4 # создать видео из фото (1.jpeg, 2.jpeg и т.д.) с framerate (частотой кадров) в создаваемом видео 2 кадра в секунду +ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental output.mp4 # запись без перекодирования (copy) RTSP-потока с камеры видеонаблюдения (+ аудио в кодеке AAC) в файл +ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -c:v copy -c:a aac -strict experimental -movflags +faststart+frag_keyframe+empty_moov output.mp4 # переместить метаданные в начало файла, что позволяет начать воспроизведение файла в видеоплеере до его полной загрузки +ffmpeg -i "rtsp://admin:password@192.168.3.201:554" -rtsp_transport tcp -frames:v 1 -c:v mjpeg output.jpg # сделать скриншот + # ImageMagick Source (https://sourceforge.net/projects/imagemagick)