Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: [Script] Выполнение команды для каждого элемента списка 
Author Message
helb



PostPosted: Tue Nov 22, 2016 16:29    Post subject: Reply with quote

Вариация на 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)
}
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group