Форум: "Прочее";
Текущий архив: 2013.04.21;
Скачать: [xml.tar.bz2];
ВнизПоток ввода в .bat-файле Windows Найти похожие ветки
← →
lead-in (2012-12-23 17:16) [0]Делаю bat`ник который запускается сторонней программой, она же передаёт bat`нику на его поток ввода некоторые данные. Каким образом эти данные в bat`нике можно "принять" (например, сохранить в переменную или просто вывести на экран)?
Поясню на примере:
a.bat (имитирует стороннюю программу):
echo "test" | b.bat
b.bat (имитирует мой будущий bat`ник):
rem Далее пытаюсь вывести полученные данные на экран...
echo %0%
echo %1%
echo %STDIN%
Никакой из вариантов не помогает(
← →
TUser © (2012-12-23 17:42) [1]echo %1
echo %*
← →
lead-in (2012-12-23 17:46) [2]TUser
Ничего не дает, пишет "Режим вывода команд на экран <ECHO> включён."
← →
NoUser (2012-12-23 18:04) [3]> Никакой из вариантов не помогает( -> мало вариантов)
a.bat:
call b.bat param_1
b.bat:
@echo off
echo %0
echo %1
echo %PATH%
← →
Юрий Зотов © (2012-12-23 18:13) [4]Вызов:
b.bat test
← →
lead-in (2012-12-23 18:14) [5]NoUser
Вот результат:
...>call b.bat var1
b.bat
var1
c:\program ... <тут вывод пер. PATH>
← →
lead-in (2012-12-23 18:18) [6]
> Юрий Зотов
test тогда как параметр передадится, но не поток ввода(
← →
Юрий Зотов © (2012-12-23 18:38) [7]> передаёт bat`нику на его поток ввода
То есть, в консоль. По дефолту она и есть поток ввода для батников.
> Каким образом эти данные в bat`нике можно "принять"
Через параметры.
a.bat
@echo off
b.bat param1 param2
b.bat
echo %1 %2
← →
NoUser (2012-12-23 18:38) [8]> она же передаёт bat`нику на его поток ввода некоторые данные.
если Вам нужен поток можно использовать временный log.txt а в b.bat for
Но интерактива (STDIN/OUT) скорее всего не получится, ибо это bat.
http://www.rsdn.ru/article/winshell/batanyca.xml
← →
lead-in (2012-12-23 18:50) [9]
> Юрий Зотов
И всё-таки предполагаю что можно передать не только через параметры, вот цитата из описания той самой проги которая вызывает bat`ник (чтобы снять вопросы, это Subversion под Windows):
# The pre-revprop-change hook is invoked before a revision property
# is added, modified or deleted. Subversion runs this hook by invoking
# a program (script, executable, binary, etc.) named "pre-revprop-change"
# (for which this file is a template), with the following ordered
# arguments:
#
# [1] REPOS-PATH (the path to this repository)
# [2] REV (the revision being tweaked)
# [3] USER (the username of the person tweaking the property)
# [4] PROPNAME (the property being set on the revision)
# [5] ACTION (the property is being "A"dded, "M"odified, or "D"eleted)
#
# [STDIN] PROPVAL ** the new property value is passed via STDIN.
#
# <...>
# <...>
# <...>
#
# On a Windows system, you should name the hook program
# "pre-revprop-change.bat" or "pre-revprop-change.exe",
# but the basic idea is the same.
> NoUser
Да всё что гугл выдал на эту тему я по диагонали посмотрел, в том числе и эту ссылку.
Но в описании к вызывающей программы (выше) по-моему явно намекается что можно данные передавать и через поток ввода.
Да 100% что можно. иначе как тогда работает такой вызов:
dir | grep test
Ведь тоже самое здесь и происходит, grep же со своего потока ввода данные берёт.
← →
Юрий Зотов © (2012-12-23 19:29) [10]
> Ведь тоже самое здесь и происходит,
Не совсем. Grep - это программа, а не батник.
← →
Юрий Зотов © (2012-12-23 19:31) [11]Программа исполняется сама, а батник исполняет cmd.
← →
Anatoly Podgoretsky © (2012-12-23 19:49) [12]И DIR тоже подпрограмма программы CMD
← →
TUser © (2012-12-23 19:54) [13]тогда так
@echo off
set /p aaa=""
echo %aaa%
G:\temp>echo 123 | aaa.bat
123
← →
Юрий Зотов © (2012-12-23 20:05) [14]
> Anatoly Podgoretsky © (23.12.12 19:49) [12]
В данном случае это неважно, потому что речь идет о переопределении потока ввода.
← →
NoUser (2012-12-23 20:37) [15]# [STDIN] PROPVAL ** the new property value is passed via STDIN.
> Но в описании к вызывающей программы (выше) по-моему явно намекается что можно данные передавать и через поток ввода.
Конечно можно, но bat не сможет с ними работать, а так как "** the new property value" сейчас ещё нет, то подойдёт и bat.
← →
lead-in (2012-12-23 20:53) [16]
> TUser
Непонятно как, но в случае с тестовыми bat-файлами работает)
А когда переношу на свою задачу нет (в качестве потока ввода всё время приходит строка "Режим вывода команд на экран (ECHO) включен."), а bat`ник у меня такой:
@echo off
set /p parval = ""
rem echo %parval% >> D:\Repositories\MainDataStorage\hooks\log.txt
echo %parval% | python "D:\Repositories\MainDataStorage\hooks\pre-revprop-change-python-script.py" %1 %2 %3 %4 %5
exit /b %errorlevel%
Не заню имеет значение или нет, но видно что задача bat`ника по-сути просто запустить питоновский скрипт и передать ему всё (параметры командной строки и поток ввода) что bat`ник получил сам.
← →
Styx (2012-12-23 21:52) [17]Если Ваш батник не должен этот входной поток как-то обрабатывать, то и забейте на него. Питон его сам получит.
А если Вы хотите сохранить его в файл - то сохраните, а потом передайте питону из файла. Типа
@echo off
setlocal
set tempfile=%date:~4%%time::=%
set tempfile=%tempfile:/=%
set tempfile=%temp%\pre-revprop-change-python-script-%tempfile:.=%.tmp
more > %tempfile%
type %tempfile% >> D:\Repositories\MainDataStorage\hooks\log.txt
type %tempfile% | python "D:\Repositories\MainDataStorage\hooks\pre-revprop-change-python-script.py" %*
set err=%errorlevel%
del /q %tempfile%
exit /b %err%
← →
NoUser (2012-12-23 22:01) [18]
> NoUser (23.12.12 20:37) [15]
фигню сморозил.
> lead-in (23.12.12 20:53) [16]
> Не заню имеет значение или нет
но задача bat`ника запустить python с нужными параметрами командной строки и передать ему данные через stdin.
pre-revprop-change-python-script.py...
msg = sys.stdin.read()
...
> в качестве потока ввода всё время приходит строка "Режим
> вывода команд на экран (ECHO) включен."
ответ есть в [10].
← →
lead-in (2012-12-23 22:14) [19]
> Styx (23.12.12 21:52) [17]
> Если Ваш батник не должен этот входной поток как-то обрабатывать,
> то и забейте на него. Питон его сам получит.
Да, так работает)
> NoUser (23.12.12 22:01) [18]
>
> pre-revprop-change-python-script.py
> ...
> msg = sys.stdin.read()
> ...
>
Ага, я так и делаю.
← →
NoUser (2012-12-23 22:26) [20]
> Styx (23.12.12 21:52) [17]
> more > %tempfile%
Спасибо, я думал, что такой возможности нет.
← →
lead-in (2012-12-23 22:32) [21]Спасибо всем (а Styx особенно) за помощь, вопрос решён)))
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.04.21;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.004 c