helb
|
Posted: Tue Nov 22, 2016 16:29 Post subject: |
|
|
Вариация на powershell. Поддерживает regex и параллельное выполнение. Главный плюс, дает манипулировать входными данными (простейшее, использовать входное имя файла в качестве выходного). В сущности лист может представлять собой любые однотипные строки на манер CSV.
Code: | <# MultiRun [by helb] v2016-11-05
Launches specified command for every item in a list (file paths or any arbitrary data in lines). Supports RegEx.
Command line usage: powershell <this script pathname> <listfile> [-re '<regex with capture groups>'] [-threads <number>] <command with parameters>
Captured groups should be represented in command with number after ‘:::’ signs (e.g. ‘:::2’)
Any ‘"’ characters inside command arguments should be escaped with ‘\"’, arguments containing ‘$’ single quoted (with apostrophes) and ‘&’ enclosed like '"<text with &>"' (e.g. '"-arg=\"weird&unu$ual\""')
Total Commander file list parameter: %UL
Запускает указанную команду для каждой записи в списке (пути файлов или любые произвольные данные строками). Поддерживает RegEx.
Использование: powershell <путь скрипта> <лист-файл> [-re '<regex включая capture-группы>'] [-threads <число>] <команда с параметрами>
Захваченные группы из регулярного выражения должны быть представлены в команде в виде «:::номер» (например «:::2»)
Любые символы «"» внутри аргументов команды требуется представить в виде «\"», аргументы содержащие «$» заключить в апострофы, «&» — заключить '"подобным образом"' (например: '"-arg=\"weird&unu$ual\""')
Параметр в Total Commander для списка файлов: %UL
Example, mux youtube video in separate video (.mp4) and audio (.m4a) dash-files into normal mp4 container:
powershell MultiRun.ps1 video-only-files-list.txt -threads 4 -re '(.+)\.mp4$' ffmpeg -i ":::0" -i ":::1.m4a" -c copy -map 0:v:0 -map 1:a:0 ":::1~.mp4"
#>
Param
(
[parameter(Position=0, Mandatory=$true)][string]$list,
[string]$re,
[int]$threads,
[parameter(ValueFromRemainingArguments=$true)][string[]]$arguments
)
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
function msgBx($text, $title, $btns = 0) {
return [System.Windows.Forms.MessageBox]::Show($text, $title, $btns)
}
if (!$list) { msgBx "No list specified." "Error"; return }
if (!$threads -or $threads -lt 1) {$threads = 1}
$list = [environment]::ExpandEnvironmentVariables($list)
if (!(test-path -literalPath $list)) { msgBx "List file not found." "Warning"; return }
$i = 0
foreach ($a in $arguments) {
if (($a -match '\s' -and $a -notmatch '^".+"$') -or $a -match ':::\d') {
$arguments[$i] = '"' + $a + '"'
}
$i++
}
$arguments
[string]$clinebase = $arguments[1..($arguments.length-1)] -join ' '
$clinebase
$jobs = @()
for ($i = 0; $i -lt $threads; $i++) {
$jobs += $null
}
get-content $list | foreach {
$cline = $clinebase -replace ':::0', $_
if ($re -and $_ -match $re) {
for ($i = 1; $i -lt $matches.count; $i++){
$cline = $cline.replace(':::' + $i, $matches[$i])
}
}
$cline
do {
$launched = $false
for ($i = 0; $i -lt $threads; $i++) {
if ($jobs[$i] -eq $null -or $jobs[$i].HasExited) {
$jobs[$i] = Start-Process $arguments[0] -PassThru -ArgumentList $cline
$launched = $true
break
}
}
if (!$launched) { Start-Sleep -m 100 }
} until ($launched)
}
|
|
|