download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Batch - изпълнение на команда в бекграунд?

Автор
Съобщение
programings
Чет, 27.03.14, 08:00
Как мога да изпълня в Batch команда в бекграунд по време на изпълнението на друга команда, и да присвоя резултата от бекграунд командата като параметър на основната? Тоест, интерпретатора стига до мястото, където е командата в бекграунд, вижда, че е такава, и я изпълнява.

Например, искам да взема съдържанието на текстов файл (echo C:\123.txt), и да го присвоя като параметър на curl, като мина само с една команда реално, една линия - основната, тази на curl.

Притеснението ми е обаче, при все, че curl е външен инструмент, ще работи ли нещо подобно - команда в бекграунд директно на параметъра?

Също да попитам, как би изглеждал следният цикъл на Batch (и защо, ако може обяснено):

for (k=0; k<100; k++) {
$p .= ",64-$p";
}

Благодарско предварително, хич ме няма с тези M$ глупости и мазохистичните им синтаксиси.

редактиран от programings на 27.03.14 08:19
insecteater
Чет, 27.03.14, 09:11

RE: Batch - изпълнение на команда в бекграунд?

” ...
Също да попитам, как би изглеждал следният цикъл на Batch (и защо, ако може обяснено):

for (k=0; k<100; k++) {
$p .= ",64-$p";
}

Благодарско предварително, хич ме няма с тези M$ глупости и мазохистичните им синтаксиси. „

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /L %%k IN (0,1,99) DO (
    REM do what you need here
    SET p=!p!,64-!p!
)
echo %p%

SETLOCAL ENABLEDELAYEDEXPANSION е необходимо, за да може да се актуализират променливите вътре в тялото на цикъла. По принцип инструкциите в тялото на цикъла са си към самия цикъл - интерпретатора изчислява променливите от сорта на p ПРЕДИ да влезе в цикъла. и си ги помни какви са били и не ги променя вътре. Затова е необходима тази инструкция. И за да се укаже, че работим с променените вътре в цикъла променливи, използваме и знака !

За мен остава загадка защо е този ред:
$p .= ",64-$p";
и дали си сигурен, че искаш да има точка, но ти си решаваш.

programings
Чет, 27.03.14, 10:03
Объркал съм се, на мястото на последното $p е $k.

Целта е при всяка интерация на цикъла в променливата да се добави със запетайка като стринг 64 (тире) съдържанието на $k, т.е. текущата интерация на цикъла, за да се получи накрая съдържание на $p под формата на стринг - 64-1, 64-2... до 100.

редактиран от programings на 27.03.14 10:06
insecteater
Чет, 27.03.14, 10:17
 
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /L %%k IN (0,1,99) DO (
    REM do what you need here
    SET p=!p!,64-%%k
)
echo %p%
pause

Не се учудвай на странностите и несъвършенствата на BATCH - целте му е малко по-друга, отколкото да бъде пълноценен език за прохграмиране със строен синтаксис, освен това е и с доста стара философия и стандарти, не като тази на съвременните езици.

Редакция: например в BATCH не можаш да влагаш FOR цикли директно, трябва да се ползват заобиколни начини

редактиран от insecteater на 27.03.14 10:22
programings
Чет, 27.03.14, 10:51
Ясно, мерси. Разбрах го, просто конструкцията е BASIC-like.

А някой да има идея как да изпълня команда в бекграунд, както напр. в Bash?

редактиран от programings на 27.03.14 10:55
insecteater
Чет, 27.03.14, 10:55
Ако обясниш възможно най-точно какво искаш .. ! Обяснението от първия пост не го схванах :)
programings
Чет, 27.03.14, 11:27
Примерно (малко псевдокод ще дойде ) :

curl --http1.1 --data ('echo C:\123.txt')

Тоест, за параметъра --data да се изпълни командата за взимане на съдържанието на 123.txt, и съдържанието му да дойде като стойност на параметъра.

редактиран от programings на 27.03.14 11:27
insecteater
Чет, 27.03.14, 13:26
А защо искаш да минеш само с една команда ?
set /p data=<C:\123.txt
curl --http1.1 --data %data%

П.П. ЕХ, тия escape-нати обратни наклонени черти

редактиран от insecteater на 27.03.14 13:27
programings
Чет, 27.03.14, 14:37
Не е проблем да използвам и две, мерси.

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.