цикл for для правильного разделения строки из arg (пакетный новичок) - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь изменить отличный код для многопоточных пакетных команд, с помощью dbenham: Параллельное выполнение процессов оболочки (не нужно читать, чтобы решить мою проблему).

Этов настоящее время принимает команды от чтения файла ссылки. Я хочу вместо этого отправить команды через аргументы. Для этого в основном потребуется только один цикл for.

Проблема заключается в том, что независимо от того, какие варианты я пробую, я не могу получить правильное разбиение цикла for. Я явно пропускаю что-то базовое с разделителями или что-то еще, несмотря на то, что я несколько раз читал документациюВероятно, это довольно тривиально для более опытного пакетного сценария, который я ожидаю, но я полностью застрял ...

Я уверен, что единственное, что нужно изменить, - это единственный оператор for:

(фрагмент multithread.bat)

 for /f "tokens=* delims=:" %%A in ('findstr /b ":::" "%~f0"') do (

В настоящее время выполняется следующее: «Поиск в файле вызывающего скрипта (из% ~ f0) любых строк, начинающихся с :::, и создание каждой из этих %%А в цикле ". Это прекрасно работает, но ...

Я хочу изменить это так, чтобы вместо этого брать строки (команды) из аргументов, предпочтительно просто анализируя% * (все аргументы). Формат ввода и порядок аргументов произвольны, поэтому не стесняйтесь менять его по своему усмотрению, если в этом есть смысл.

Позвольте мне проиллюстрировать на базовом примере, как это может выглядеть на практике:

(основной скрипт - для иллюстрации)

::these are the commands we want to run, ideally I'd like to support an arbitrary number of them
set command1="rclone size remote1:"
set command2="rclone size remote2:"
set command3="rclone size remote3:"

call multithread.bat /O 2 %command1% %command2% %command3%

:: /O indicates we ask for more verbose output from the command controller
:: 2 indicates the desired max amount of conurrently running threads
:: We just want to skip these in the for-loop as they are picked up elsewhere in the script.

Так как же должен выглядеть этот цикл for, чтобы %% A был командой 1,2,3 (и т. Д., Если больше команд)? Например, при первом запуске цикла %% A в этом примере должно быть:

rclone size remote1:

then ...

rclone size remote2:

во второй раз и т. Д.

1 Ответ

0 голосов
/ 29 октября 2019

Вы можете использовать for %%a in (%*) do ..., но вам придется игнорировать первые два аргумента. Позвольте мне предложить другой подход:

@echo off
setlocal enabledelayedexpansion   
set "verbose=%~1"
set "max="%~2"
shift&shift
echo Verbose=%verbose%
echo Maximum=%max%
:loop
if "%~1"=="" goto :continue
echo execute command: %~1
shift
goto :loop
:continue
echo done.

Выполнить как test.bat /O 2 "rclone size remote1:" "rclone size remote2:" "rclone size remote3:"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...