Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Подстановка большого количества параметров. (http://forum.oszone.net/showthread.php?t=224053)

Zeneth 29-12-2011 14:50 1824904

Подстановка большого количества параметров.
 
Всех с наступающим!

Народ, подскажите пожалуйста, как реализовать?

Есть некая программа, и куча файлов.
Нужно, чтобы батник запускал эту программы в виде:
programm.exe blabla.txt blabla1.txt .... blabla999.txt.
то есть чтобы батник запускал программу с параметрами в виде имен файлов(с расширением) разделенными через пробел.

Как я понимаю, самый простой способ, это использовать %1-%9, но этих переменных всего девять... (не считая нуля)
а файлов, зачастую, куда больше.

вот такое вот наваял:
Код:

for %%e in (*.xyz) do (
Echo  %%~nxe>>Big.txt
)

Таким образом, я получаю файл с нужным мне текстом, так как конкатенации строк, как я понимаю в батах нет.(Может я все-таки ошибаюсь?)
Все было бы замечательно, но.
Почему-то Echo записывает не только название файла, но и зачем-то добавляет в конец символ конца строки.
И того у меня выходит файл с построчно выведенными именами файлов, а считать можно только одну строку..

Итак вопрос: как считать весь файл в переменную? Или может не стоит даже заморачиваться с файлом, а можно сделать проще?
Заранее спасибо :)

gora 29-12-2011 15:05 1824916

Цитата:

Цитата Zeneth
самый простой способ, это использовать %1-%9, но этих переменных всего девять »

Есть еще %* которая содержит все параметры ком строки даже если их больше девяти.

Zeneth 29-12-2011 15:22 1824929

Как интересно, спасибо за быстрый ответ.
Но тогда возникает другой вопрос: как же это использовать? Почему-то запись %~nx* не работает. Как-то иначе можно использовать? И более того, если в %* все параметры, то там и %0?. А %0 - это это имя бат файла. Оно мне точно не нужно :)

gora 29-12-2011 15:37 1824940

Цитата:

Цитата Zeneth
Нужно, чтобы батник запускал эту программы в виде:
programm.exe blabla.txt blabla1.txt .... blabla999.txt.
то есть чтобы батник запускал программу с параметрами в виде имен файлов(с расширением) разделенными через пробел. »

Цитата:

Цитата Zeneth
как же это использовать? »

Запуск батника строкой:
Код:

test.bat blabla1.txt blabla2.txt blabla3.txt blabla4.txt blabla5.txt blabla6.txt blabla7.txt blabla8.txt blabla9.txt blabla10.txt blabla11.txt blabla12.txt blabla13.txt blabla14.txt
Сам батник test.bat:
Код:

@Echo Off
Echo programm.exe %*
Pause>nul

Echo для контроля, удалите его после проверки
Цитата:

Цитата Zeneth
то там и %0?. »

Нет, его там нет.

Можно запустить и так:
Код:

test.bat "blabla1.txt blabla2.txt blabla3.txt blabla4.txt blabla5.txt blabla6.txt blabla7.txt blabla8.txt blabla9.txt blabla10.txt blabla11.txt blabla12.txt blabla13.txt blabla14.txt"
Сам батник тогда будет выглядеть так test.bat:
Код:

@Echo Off
Echo programm.exe %~1
Pause>nul


Zeneth 29-12-2011 16:07 1824974

Понятно, спасибо.
Но все-же.. проблемы это не решает пока...
Дело в том, что файлов очень много. Следовательно запуск батника с параметрами - это тупо перетаскивание всех файлов на сам батник. Если сделать так, то в %* содержатся все те файлы с путями. запись %~nx* не работает.

сделать так:
Код:

test.bat blabla1.txt blabla2.txt blabla3.txt blabla4.txt blabla5.txt blabla6.txt blabla7.txt blabla8.txt blabla9.txt blabla10.txt blabla11.txt blabla12.txt blabla13.txt blabla14.txt
это все равно, что выполнить
Код:

programm.exe blabla1.txt blabla2.txt blabla3.txt blabla4.txt blabla5.txt blabla6.txt blabla7.txt blabla8.txt blabla9.txt blabla10.txt blabla11.txt blabla12.txt blabla13.txt blabla14.txt
проблема в том, что приходится руками дописывать кучу файлов... а это крайне неудобно...

есть еще варианты?

gora 29-12-2011 16:20 1824984

Цитата:

Цитата Zeneth
проблема в том, что приходится руками дописывать кучу файлов »

О том, что эту ком строку нужно сформировать автоматически в вопросе не звучало. Было:
Цитата:

Цитата Zeneth
Есть некая программа, и куча файлов.
Нужно, чтобы батник запускал эту программы в виде:
programm.exe blabla.txt blabla1.txt .... blabla999.txt.
то есть чтобы батник запускал программу с параметрами в виде имен файлов(с расширением) разделенными через пробел. »

Не указано: где лежат эти файлы, есть ли там другие (ненужные в ком строке) файлы, по какому критерию (порядку) составлять список файлов в ком строке и т.д.. Уточните

И зачем тогда передавать эти имена в ком строке батнику, если их можно получить в самом батнике и сразу же запустить исполняемый файл с ними.

Может так?
Код:

@Echo Off
SetLocal enabledelayedexpansion
for %%e in (*.txt) do Set allfiles=!allfiles! %%~nxe
Echo programm.exe!allfiles!
Pause


Zeneth 29-12-2011 16:36 1824994

Цитата:

Не указано: где лежат эти файлы, есть ли там другие (ненужные в ком строке) файлы, по какому критерию (порядку) составлять список файлов в ком строке и т.д.. Уточните
Уточняю, там только файлы одного типа *.xyz. То есть, в папке нет ничего лишнего. По крайней мере не должно быть. Где лежат? В папке. Просто в папке на диск :) По какому критерию составлять список файлов? абсолютно все равно, важен лишь полный перебор названий всех файлов с расширениями. Разделены должны быть пробелами. Это все.


Цитата:

И зачем тогда передавать эти имена в ком строке батнику, если их можно получить в самом батнике и сразу же запустить исполняемый файл с ними.
В том то и вопрос, как их получить в батнике так, чтобы можно было их сразу же передать исполняемому файлу в качестве параметров?

Может я не понимаю чего-то очевидного?

Zeneth 29-12-2011 17:01 1825003

Цитата:

Может так?
Код:

@Echo Off SetLocal enabledelayedexpansion for %%e in (*.txt) do Set allfiles=!allfiles! %%~nxe Echo programm.exe!allfiles! Pause

Во, так работает. Спасибо!
Если не сложно, подскажите, что это за SetLocal enabledelayedexpansion? и вот эта запись: allfiles=!allfiles! %%~nxe - это как я понимаю - дописывание к строке.... почему-то у меня не получалось...

В любом случае, большое спасибо! :)

kiripanda 29-12-2011 17:51 1825025

Цитата:

Во, так работает.
enabledelayedexpansion вызывает проблему с именами содержащими символ !

Код:

@Echo Off
for %%e in (*.txt) do (
        Set "file=%%~nxe"
        Call Set allfiles=%%allfiles%% "%%file:^%%=^^^%%%%"
)
Call Echo programm.exe%%allfiles%%
Pause

и имена лучше брать в кавычки, потому что в них м.б. пробелы и др. спецсимволы, которых в batch'e туёва хуча

El Sanchez 29-12-2011 18:07 1825038

Цитата:

Цитата Zeneth
что это за SetLocal enabledelayedexpansion? »

Zeneth, включение режима отложенного раскрытия переменных, когда символ % в имени переменной заменяется на !, имеющего меньший приоритет. Включение не позволяет переменной allfiles раскрываться при каждой итерации цикла, иначе переменная получит значение только последней итерации (имя последнего файла). Но есть один минус - если в названии файла будет присутствовать символ !, то при включенном режиме при обработке имен этот символ будет "проглочен" интерпретатором, в результате чего имя файла будет уже неверным. Вот вариант без включения режима:
Код:

@echo off
setlocal
for %%e in (*.xyz) do if not defined allfiles (Set allfiles="%%~nxe") else (Call Set allfiles=%%allfiles%% "%%~nxe")
Echo programm.exe %allfiles%
Pause

oops, kiripanda уже ответил

Iska 29-12-2011 18:40 1825065

Почему никто не вспомнил про «shift»?

Zeneth 29-12-2011 23:21 1825259

kiripanda,
Цитата:

Цитата: Во, так работает. enabledelayedexpansion вызывает проблему с именами содержащими символ ! Код: @Echo Off for %%e in (*.txt) do ( Set "file=%%~nxe" Call Set allfiles=%%allfiles%% "%%file:^%%=^^^%%%%" ) Call Echo programm.exe%%allfiles%% Pause и имена лучше брать в кавычки, потому что в них м.б. пробелы и др. спецсимволы, которых в batch'e туёва хуча
Полезное замечание. Правда в моем случае это не имеет никакого значения...
Но код меня заинтересовал. Зачем куча ^? Почему в конце четыре знака процента, да еще и без переменной...
Вообще не понятно, что это за разыменование такое хитрое?:) Для чего здесь используется Call?


El Sanchez ,
Цитата:

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

Ishka,
Цитата:

Почему никто не вспомнил про «shift»?
А что про шифт можно вспомнить? С удовольствием послушаю :)
Я про шифт знаю только то, что он сдвигает(необратимо) номера %0-%9 и делает их %1-%10 ну и так далее... или как-то так.. в общем я смутно помню уже :)

kiripanda 30-12-2011 12:39 1825523

Цитата:

Зачем куча ^? Почему в конце четыре знака процента, да еще и без переменной...
Вообще не понятно, что это за разыменование такое хитрое? Для чего здесь используется Call?
Call использован как альтернатива enabledelayedexpansion.
Четыре знака процента (на самом деле 8 = 2 раза по 2 пары) потому, что в батниках, в отличии от ком.строки, знаки процента нужно удваивать – спецсимвол, однако.
Куча ^ для экранирования спецсимвола % и самого себя, потому что опять же спецсимвол.
В общем, проще сделать, чем объяснить как работает :D
Про "знак процента без переменной" прочитайте set/?

Цитата:

Почему никто не вспомнил про «shift»?
ИМХО shift здесь не поможет, потому что выполняет противоположную задачу – выбирает из строки параметров по одному.
А нужно наоборот, из построчного списка (который читается по одному элементу командой for) сделать непрерывный.

ЗЫ
попробуйте lst2str _http://www.ghisler.com/tools.htm

Iska 30-12-2011 13:16 1825543

Значит, я неправильно понял поставленную задачу.


Время: 09:53.

Время: 09:53.
© OSzone.net 2001-