Страница 2 из 3

Добавлено: Чт окт 30, 2014 21:06
Dimsok
Спасиб, поробую, просто об этом нигде не написано. Кроме тебя на этом форуме все вымерли

Добавлено спустя 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}}- игнорит напрочь, даже ошибки нет, все в той же панели все творит

Добавлено: Чт окт 30, 2014 21:35
Flasher
Dimsok писал(а):"{{%WL}}" --priority -b 64 -h --tt "{{%WL}}.mp3"
:?:
Dimsok писал(а):Кроме тебя на этом форуме все вымерли
На подфоруме. Не все знают что ответить либо не успевают, когда могут. :)

Добавлено: Чт окт 30, 2014 21:54
Dimsok
Ну я конкретно не про ответ, а вообще, про активность. Вернее, про её отсутсвие

Добавлено: Пт окт 31, 2014 12:29
Dimsok
Не пойму, что не так

-i "{{%WL}}" -o "%t{{%WF}}.divx"

Работает только с именами файлов без пробелов. В текущей панели нормально без пробелов работает. Если только вместо F не подставить f, но тогда имена файлов на выходе каверкаются.

И вообще я так понял, что кавычки с {{ не обязательны. Если с пробелами работает, так и без них нормально, если нет, то все равно не помогают

И как бы организовать удаление исходников. Что то типа && del /f /q "{{%WL}}"" не помогает

Добавлено: Пт окт 31, 2014 17:39
Flasher
Dimsok писал(а):-i "{{%WL}}" -o "%t{{%WF}}.divx"
А почему %t, а не %T?
Dimsok писал(а):И как бы организовать удаление исходников.
Не хочу чужой код ковырять, пусть Batya сам при желании добавит опцию.
Dimsok писал(а):Что то типа && del /f /q "{{%WL}}"" не помогает
И не поможет, это не cmd.

Добавлено: Пт окт 31, 2014 17:54
Dimsok
С %T пробовал, но пути с пробелами не видит

Имена файлов без расширений тоже никак нельзя сделать?

Добавлено: Пт окт 31, 2014 18:44
Flasher
Нужно модифицировать код в любом случае.

Добавлено: Пт ноя 14, 2014 12:18
Batya
Dimsok
Что-то вы тут с 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) 
Играй параметрами и смотри, что в итоге у тебя хочет запускаться. По результатам экспериментов, если у самого ничего путного не выйдет, обращайся.
Dimsok писал(а):И как бы организовать удаление исходников. Что то типа && del /f /q "{{%WL}}"" не помогает
Как верно заметил Flasher, это не cmd. Но, как раз, запуск cmd может помочь - попробуй в параметрах вызывать не "01 "%%COMMANDER_PATH%%\Plugins\exe\balabolka\lame.exe" ...", а "01 cmd "%%COMMANDER_PATH%%\Plugins\exe\balabolka\lame.exe" ...". А потом уже "&& del ...".
Кстати, можно посмотреть пример использования с удалением здесь.

P.S. На форуме бываю редко, т.ч. быстрый ответ не обещаю.

Добавлено: Пт ноя 14, 2014 17:19
Flasher
Batya писал(а):Что-то вы тут с Flasher накрутили...
Да я ничего тут не крутил. :)
Batya писал(а):Но, как раз, запуск cmd может помочь
А с этим-то он как поможет?:
Dimsok писал(а):Имена файлов без расширений
Такое прокатит?: "%%~n{{%WF}}.mp3"

Добавлено: Сб ноя 15, 2014 09:42
Batya
Flasher писал(а):А с этим-то он как поможет?:
А вот для этого я и писал:
Batya писал(а):Вообщем, поменяй для теста в скрипте
...
Играй параметрами и смотри, что в итоге у тебя хочет запускаться.

Добавлено: Сб ноя 15, 2014 16:20
Dimsok
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 минуты:

Аа, понял, поменять ' местами. А что это должно изменить?

Добавлено: Сб ноя 15, 2014 17:22
Flasher
Dimsok писал(а):А что это должно изменить?
Написано же - для проверки. Покажет запись комстроки.

Добавлено: Ср апр 13, 2016 03:08
Victor_Dobrov
Небольшая доработка, можно не указывать режим, и можно задать число одновременно выполняемых задач (по числу ядер процессора)
[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
[/cut]

Добавлено: Ср апр 13, 2016 07:05
Avada
Victor_Dobrov
Для скриптов такого размера на форуме лучше применять спойлеры! Исправлено.

Добавлено: Вт ноя 22, 2016 15:29
helb
Вариация на 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)
}