[Script] Выполнение команды для каждого элемента списка
Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik
Спасиб, поробую, просто об этом нигде не написано. Кроме тебя на этом форуме все вымерли
Добавлено спустя 6 минут:
Кстати, че то с "%T" не удается использовать. В винраре только. А вот например с этим
TOTALCMD#BAR#DATA
"c:\Program Files\Total Commander\Utils\WHS\MultiRun.vbs"
01 "%%COMMANDER_PATH%%\Plugins\exe\balabolka\lame.exe" {{%WL}} --priority -b 64 -h --tt "{{%WL}}.mp3
%COMMANDER_PATH%\Plugins\exe\balabolka\lame.exe
Convert all wav to mp3
1
-1
Пробовал вышеуказанный параметр c {{%WL}}- игнорит напрочь, даже ошибки нет, все в той же панели все творит
Добавлено спустя 6 минут:
Кстати, че то с "%T" не удается использовать. В винраре только. А вот например с этим
TOTALCMD#BAR#DATA
"c:\Program Files\Total Commander\Utils\WHS\MultiRun.vbs"
01 "%%COMMANDER_PATH%%\Plugins\exe\balabolka\lame.exe" {{%WL}} --priority -b 64 -h --tt "{{%WL}}.mp3
%COMMANDER_PATH%\Plugins\exe\balabolka\lame.exe
Convert all wav to mp3
1
-1
Пробовал вышеуказанный параметр c {{%WL}}- игнорит напрочь, даже ошибки нет, все в той же панели все творит
Dimsok писал(а):"{{%WL}}" --priority -b 64 -h --tt "{{%WL}}.mp3"
На подфоруме. Не все знают что ответить либо не успевают, когда могут.Dimsok писал(а):Кроме тебя на этом форуме все вымерли
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Не пойму, что не так
-i "{{%WL}}" -o "%t{{%WF}}.divx"
Работает только с именами файлов без пробелов. В текущей панели нормально без пробелов работает. Если только вместо F не подставить f, но тогда имена файлов на выходе каверкаются.
И вообще я так понял, что кавычки с {{ не обязательны. Если с пробелами работает, так и без них нормально, если нет, то все равно не помогают
И как бы организовать удаление исходников. Что то типа && del /f /q "{{%WL}}"" не помогает
-i "{{%WL}}" -o "%t{{%WF}}.divx"
Работает только с именами файлов без пробелов. В текущей панели нормально без пробелов работает. Если только вместо F не подставить f, но тогда имена файлов на выходе каверкаются.
И вообще я так понял, что кавычки с {{ не обязательны. Если с пробелами работает, так и без них нормально, если нет, то все равно не помогают
И как бы организовать удаление исходников. Что то типа && del /f /q "{{%WL}}"" не помогает
А почему %t, а не %T?Dimsok писал(а):-i "{{%WL}}" -o "%t{{%WF}}.divx"
Не хочу чужой код ковырять, пусть Batya сам при желании добавит опцию.Dimsok писал(а):И как бы организовать удаление исходников.
И не поможет, это не cmd.Dimsok писал(а):Что то типа && del /f /q "{{%WL}}"" не помогает
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Dimsok
Что-то вы тут с Flasher накрутили...
Вообщем, поменяй для теста в скриптена
Играй параметрами и смотри, что в итоге у тебя хочет запускаться. По результатам экспериментов, если у самого ничего путного не выйдет, обращайся.
Кстати, можно посмотреть пример использования с удалением здесь.
P.S. На форуме бываю редко, т.ч. быстрый ответ не обещаю.
Что-то вы тут с Flasher накрутили...
Вообщем, поменяй для теста в скрипте
Код: Выделить всё
'Тестовая строка - раскомментарить для проверки
'MsgBox L, vbOKOnly, Mess(5)
WSH.Run L, 7, (Mode(1) = 0) Код: Выделить всё
'Тестовая строка - раскомментарить для проверки
MsgBox L, vbOKOnly, Mess(5)
'WSH.Run L, 7, (Mode(1) = 0) Как верно заметил Flasher, это не cmd. Но, как раз, запуск cmd может помочь - попробуй в параметрах вызывать не "01 "%%COMMANDER_PATH%%\Plugins\exe\balabolka\lame.exe" ...", а "01 cmd "%%COMMANDER_PATH%%\Plugins\exe\balabolka\lame.exe" ...". А потом уже "&& del ...".Dimsok писал(а):И как бы организовать удаление исходников. Что то типа && del /f /q "{{%WL}}"" не помогает
Кстати, можно посмотреть пример использования с удалением здесь.
P.S. На форуме бываю редко, т.ч. быстрый ответ не обещаю.
Нет, я не сплю. Я просто медленно моргаю.
Да я ничего тут не крутил.Batya писал(а):Что-то вы тут с Flasher накрутили...
А с этим-то он как поможет?:Batya писал(а):Но, как раз, запуск cmd может помочь
Такое прокатит?: "%%~n{{%WF}}.mp3"Dimsok писал(а):Имена файлов без расширений
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Чего-то я не вижу разницы. И для какой это цели? Это должно помочь читать имен файлов без расширений?Batya писал(а): Вообщем, поменяй для теста в скриптенаКод: Выделить всё
'Тестовая строка - раскомментарить для проверки 'MsgBox L, vbOKOnly, Mess(5) WSH.Run L, 7, (Mode(1) = 0)Код: Выделить всё
'Тестовая строка - раскомментарить для проверки MsgBox L, vbOKOnly, Mess(5) 'WSH.Run L, 7, (Mode(1) = 0)
Добавлено спустя 3 минуты:
Аа, понял, поменять ' местами. А что это должно изменить?
Написано же - для проверки. Покажет запись комстроки.Dimsok писал(а):А что это должно изменить?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
-
Victor_Dobrov
- Сообщения: 50
- Зарегистрирован: Вт июл 15, 2008 19:21
Небольшая доработка, можно не указывать режим, и можно задать число одновременно выполняемых задач (по числу ядер процессора)
[cut][/cut]
[cut]
Код: Выделить всё
'=======================================================================================
' Выполнение указанной команды (программы) для каждого элемента файла-списка
' Параметры скрипта:
' [1] - Набор режимов, где каждый режим определяется цифрами по разрядам:
' 1 - обрабатывать каждый список отдельно (0 - умолч.) или синхронно (1),
' 2 - последовательное (0 - умолч.) или параллельное (по числу ядер) выполнение команд по списку
' 2 и далее - Выполняемая команда (программа) и параметры к ней
' Начало и конец файла-списка определяется заданными ниже символами (набором символов).
' Команда выполняется для каждого элемента списка, подстановкой этого элемента в местоположение списка.
' В качестве параметра может быть указано текстовое содержимое буфера обмена.
' Тэг буфера обмена задается в секции скрипта "Изменяемые параметры".
' Для использования буфера обмена в системе должен быть установлен TCScript.Helper.
' Например, параметры вызова из TC для одновременного фонового извлечения из архивов,
' пароль к которым находится в буфере обмена, в текущую папку:
' 10 "%ProgramFiles%\WinRar\WinRar.Exe" X -ibck -p### "%P{{%L}}" "%P"
'
' Автор - Batya
' Версия - 1.2
' + Dobrov: можно не писать режим, по-умолчанию 14 (синхронно, 4 задачи максимум)
'======================================================================
Option Explicit
'================= Изменяемые параметры ================================================
Const ListBegin = "{{" 'Начало списка
Const ListEnd = "}}" 'Конец списка
Const ClipboardTag = "###" 'Тэг буфера обмена
'=======================================================================================
Dim FSO, WSH, Mess, Mode(1), Command, i, L, P, LenListBegin, LenListEnd, Clipboard, Hint, L1, L1s, R, C, m, z
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")
R = "14" 'режим по-умолчанию: каждый список синхронно, 4 задачи одновременно
'Задаем массив сообщений
MessDefine : LenListBegin = Len(ListBegin) : LenListEnd = Len(ListEnd)
'Проверяем параметры
CheckParams
'Выполняем команды по списку
For Each L In SearchList(Command, 0)
C = C +1 'счётчик активных задач
WSH.Run L, 7, (C >= CInt(Mode(1)))
' MsgBox L, vbOKOnly, (C >= CInt(Mode(1))) 'Тестовая строка - раскомментарить для проверки
if C >= CInt(Mode(1)) then C = 0
Next
Quit 'Выход
'===== Процедуры и функции =============================================================
'Проверка входных параметров
Sub CheckParams
Dim k, lP, n, F
With WScript
If .Arguments.Count < 1 Then
MsgBox Mess(2), vbCritical + vbOKOnly, Mess(0)
Quit
End If
F = IsNumeric(.Arguments(0)) and (.Arguments.Count > 1)
If F then m = .Arguments(0)
m = m & Right(R, Len(R) - Len(m))
For i = Abs(F) To .Arguments.Count - 1
lP = WSH.ExpandEnvironmentStrings(.Arguments(i))
If InStr(lP, " ") > 0 Then lP = """" & lP & """"
Command = Command & " " & lP
Next
Command = Mid(Command, 2)
End With
n = UBound(Mode) + 1
For i = 0 To n - 1
k = Mid(m, i + 1, 1) 'Берем очередной разряд
Mode(i) = k
Next
End Sub
'Поиск в строке тэгов файлов-списков и формирование массива элементов
Function SearchList(pStr, byVal pDepth)
Dim lList, lL, lPos1, lPos2, lStr, lBegin, lEnd, lList1, lL1, lList2, k, m
If UCase(ListBegin) = UCase(ListEnd) Then
'Ищем начало списка
lPos1 = InStr(1, pStr, ListBegin, vbTextCompare)
If lPos1 = 0 Then
SearchList = Array(SearchClipboard(pStr))
Exit Function
End If
'Ищем конец списка
lPos2 = InStr(lPos1 + LenListBegin, pStr, ListEnd, vbTextCompare)
If lPos2 = 0 Then
SearchList = Array(SearchClipboard(pStr))
Exit Function
End If
Else
'Ищем конец списка
lPos2 = InStr(1, pStr, ListEnd, vbTextCompare)
If lPos2 = 0 Then
SearchList = Array(SearchClipboard(pStr))
Exit Function
End If
'Ищем начало списка
lPos1 = InStrRev(pStr, ListBegin, lPos2 - 1, vbTextCompare)
If lPos1 = 0 Then
SearchList = Array(SearchClipboard(pStr))
Exit Function
End If
End If
'Файл-список
lList = Mid(pStr, lPos1 + LenListBegin, lPos2 - lPos1 - LenListBegin)
'Если файла-списка не существует, выходим
If Not FSO.FileExists(lList) Then
MsgBox Mess(3) & " """ & lList & """ " & Mess(4),_
vbCritical + vbOKOnly, Mess(0)
Quit
End If
'Начало и конец командной строки
lBegin = Left(pStr, lPos1 - 1)
lEnd = Mid(pStr, lPos2 + LenListBegin)
'Перебираем список
lList2 = Split(FSO.OpenTextFile(lList, 1, False, -2).ReadAll, vbNewLine)
m = pDepth
If pDepth = 0 Then
pDepth = UBound(lList2)
m = 0
End If
For k = m To pDepth
lL = lList2(k)
If lL = "" Then Exit For
lL = WSH.ExpandEnvironmentStrings(lL)
If InStr(lL, " ") > 0 Then lL = """" & lL & """"
'Формируем выходной список в зависимости от режима
Select Case Mode(0)
Case 0
'Рекурсивный поиск списка
lList1 = SearchList(lBegin & lL & lEnd, 0)
For Each lL1 In lList1
lStr = lStr & vbNewLine & lL1
Next
Case 1
'Рекурсивный поиск списка
lList1 = SearchList(lBegin & lL & lEnd, k)
lStr = lStr & vbNewLine & lList1(0)
End Select
Next
SearchList = Split(SearchClipboard(Mid(lStr, Len(vbNewLine) + 1)), vbNewLine)
End Function
'Подстановка текстового значения из буфера обмена
Function SearchClipboard(pStr)
If UBound(Filter(Array(pStr), ClipboardTag)) >= 0 Then
SearchClipboard = Replace(pStr, ClipboardTag, GetClipboard)
Else
SearchClipboard = pStr
End If
End Function
'Содержимое буфера обмена
Function GetClipboard()
If IsEmpty(Clipboard) Then
GetClipboard = CreateObject("TCScript.Helper").GetTextFromClip
Else
GetClipboard = Clipboard
End If
End Function
'Описание сообщений
Sub MessDefine
Set Mess = CreateObject("Scripting.Dictionary")
With Mess
.Add 0, "Выполнение программы для списка"
.Add 1, "Не указаны параметры!"
.Add 2, "Не указана выполняемая команда!"
.Add 3, "Файл-список"
.Add 4, "не существует!"
.Add 5, "Тест командной строки"
End With
End Sub
'Выход
Sub Quit
Set Mess = Nothing
Set WSH = Nothing
Set FSO = Nothing
WScript.Quit
End Sub
Вариация на powershell. Поддерживает regex и параллельное выполнение. Главный плюс, дает манипулировать входными данными (простейшее, использовать входное имя файла в качестве выходного). В сущности лист может представлять собой любые однотипные строки на манер CSV.
Код: Выделить всё
<# 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)
}