Войти

Показать полную графическую версию : Подстановка большого количества параметров.


Zeneth
29-12-2011, 14:50
Всех с наступающим!

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

Есть некая программа, и куча файлов.
Нужно, чтобы батник запускал эту программы в виде:
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
самый простой способ, это использовать %1-%9, но этих переменных всего девять »
Есть еще %* которая содержит все параметры ком строки даже если их больше девяти.

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

gora
29-12-2011, 15:37
Нужно, чтобы батник запускал эту программы в виде:
programm.exe blabla.txt blabla1.txt .... blabla999.txt.
то есть чтобы батник запускал программу с параметрами в виде имен файлов(с расширением) разделенными через пробел. »
как же это использовать? »
Запуск батника строкой: 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 для контроля, удалите его после проверкито там и %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
Понятно, спасибо.
Но все-же.. проблемы это не решает пока...
Дело в том, что файлов очень много. Следовательно запуск батника с параметрами - это тупо перетаскивание всех файлов на сам батник. Если сделать так, то в %* содержатся все те файлы с путями. запись %~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
проблема в том, что приходится руками дописывать кучу файлов »
О том, что эту ком строку нужно сформировать автоматически в вопросе не звучало. Было:Есть некая программа, и куча файлов.
Нужно, чтобы батник запускал эту программы в виде:
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
Не указано: где лежат эти файлы, есть ли там другие (ненужные в ком строке) файлы, по какому критерию (порядку) составлять список файлов в ком строке и т.д.. Уточните
Уточняю, там только файлы одного типа *.xyz. То есть, в папке нет ничего лишнего. По крайней мере не должно быть. Где лежат? В папке. Просто в папке на диск :) По какому критерию составлять список файлов? абсолютно все равно, важен лишь полный перебор названий всех файлов с расширениями. Разделены должны быть пробелами. Это все.


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

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

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

Zeneth
29-12-2011, 17:01
Может так? @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
Во, так работает.
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
что это за 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
Почему никто не вспомнил про «shift»?

Zeneth
29-12-2011, 23:21
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
Зачем куча ^? Почему в конце четыре знака процента, да еще и без переменной...
Вообще не понятно, что это за разыменование такое хитрое? Для чего здесь используется Call?
Call использован как альтернатива enabledelayedexpansion.
Четыре знака процента (на самом деле 8 = 2 раза по 2 пары) потому, что в батниках, в отличии от ком.строки, знаки процента нужно удваивать – спецсимвол, однако.
Куча ^ для экранирования спецсимвола % и самого себя, потому что опять же спецсимвол.
В общем, проще сделать, чем объяснить как работает :D
Про "знак процента без переменной" прочитайте set/?

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

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

Iska
30-12-2011, 13:16
Значит, я неправильно понял поставленную задачу.




© OSzone.net 2001-2012