[ОТВЕТИТЬ]
24.06.2014 22:16
OlegON
 
Помогите, пожалуйста, а то мне уже и гугл по Линуксу все предлагает :)
В общем, в Linux есть финт типа
Код:
program <<EOF
команда программы 1
команда программы 2
команда программы 3
EOF
Обозначающий, что будет запущена program, после чего в нее будут переданы последовательно три команды с Enter
Как такое сделать в Windows? Цель - не создавать отдельный скрипт, а передать несколько команд прямо в одном скрипте. Всяческие варианты с echo плохи необходимостью экранировать кавычки и т.п., что-то вроде << есть? Мне кажется, что я когда-то этим пользовался и под виндой.
Плохой вариант с echo приведу сразу
Код:
@echo off
( echo cmd1
echo cmd2
echo cmd3 ) | program
25.06.2014 10:56
KirillHome
 
На сколько я в курсе - лучшего ничего нет.
Есть вариация такого же решения - сначала выводим информацию во временный файл, а потом переназначаем на него ввод

Код:
@Echo off
echo Param1 > %temp%\TempFile.txt
echo Param2 >> %temp%\TempFile.txt
echo Param3 >> %temp%\TempFile.txt
programm < %temp%\TempFile.txt
Но всё равно - срабатывает не всегда. К примеру, в DiskPart таким образом ответы не передаются (именно в DiskPart, правда, можно передать сценарий ответов через ключ /s).
25.06.2014 11:01
OlegON
 
Как я уже говорил, все варианты с echo упираются в экранирование :( Да и вообще через одно место... С временным файлом еще хуже в свете возможного отсутствия права на запись.
25.06.2014 12:22
KirillHome
 
Ещё один вариант (с vbscript)

Вот такой bat-файл (test.bat)
Код:
@echo off
set /p DirN=Dirname1
md %DirN%
set /p DirNew=Dirname2
md %DirNew%
И к нему - такой vbs-файл (test.vbs)
Код:
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run ("test.bat")

WScript.Sleep(300)
WshShell.SendKeys "123"
WshShell.SendKeys ("{ENTER}")
WScript.Sleep(300)
WshShell.SendKeys "456"
WshShell.SendKeys ("{ENTER}")
Кладём в один каталог, запускаем test.vbs - создаются два подкаталога (123 и 456).

Ряд символов + ^ % ~ ( ) { } [ ] тоже надо экранировать
25.06.2014 13:57
OlegON
 
Прикалываешься, да? :) Суть-то как раз в том, чтобы одним файлом скрипт был. А тут еще и vbs очень ненадежная штука, в плане, что у многих отрублен.
25.06.2014 14:08
KirillHome
 
Если честно - не очень понял изначальную задачу. И поэтому всякую фигню горожу...

К примеру: А что если просто передать в качестве параметров в скрипт нужную информацию?
25.06.2014 15:47
twix
 
Цитата:
KirillHome Если честно - не очень понял изначальную задачу. И поэтому всякую фигню горожу...

К примеру: А что если просто передать в качестве параметров в скрипт нужную информацию?
Это не *nix way же. Надо чтобы всякие там грепы и перенаправления вывода использовались, иначе скучно.
25.06.2014 16:08
OlegON
 
Нене, речь идет о том, чтобы передать в программу несколько строк. При этом не использовать внешний файл.
Например, Контроль длины очереди почтовика
Как видно, я поставил <<EOF и дальше спокойно пишу скрипт, не заморачиваясь различными эскейп-последовательностями и т.п. Получается нечто вроде ресурсов в бинарнике.
25.06.2014 16:19
twix
 
А не проще ли всё засунуть в sql-файлик, и по крону вызывать sqlplus с передачей единственного параметра?
25.06.2014 16:36
OlegON
 
Если речь о тиражируемом решении - ни разу не проще. Давайте не будем обсуждать тему, что лучше один файлик или два? Вопрос в том, может говвинда это делать или нет?
25.06.2014 16:51
twix
 
Куцым cmd? На вряд ли. Самый нормальный вариант, как мне кажется, через временный файл.
Попробую чуть погуглить про этот изврат для PowerShell.
25.06.2014 17:04
OlegON
 
Все варианты с echo приводят к желанию застрелиться при передаче, например
таких
Цитата:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'mv_update_430',
job_type => 'PLSQL_BLOCK',
job_action => 'begin dbms_mview.refresh(''"FDC_EXEC"."FDC_MV_REPORT_430"''); end;',
repeat_interval => 'FREQ=MONTHLY; BYMONTHDAY=-2',
enabled => TRUE
);
END;
или таких Список прав системных пользователей (IBS,AUD,AUDM) на объекты скриптов, т.е. где каша из символов, которые надо экранировать.
25.06.2014 17:36
KirillHome
 
Цитата:
OlegON Вопрос в том, может винда это делать или нет?
Таким образом, как ты хочешь - нет, не умеет.
Другие варианты возможны.

Цитата:
OlegON Все варианты с echo приводят к желанию застрелиться при передаче, например
таких
или таких Список прав системных пользователей (IBS,AUD,AUDM) на объекты скриптов, т.е. где каша из символов, которые надо экранировать.
В случае - пишем во временный файл, потом перенаправляем вывод с консоли на этот временный файл - получается, что в предложенном тобой примере 1 - надо экранировать только символ >
Код:
echo BEGIN > t3.txt
echo DBMS_SCHEDULER.CREATE_JOB (  >> t3.txt
echo job_name =^> 'mv_update_430', >> t3.txt
echo job_type =^> 'PLSQL_BLOCK', >> t3.txt
echo job_action =^> 'begin dbms_mview.refresh(''"FDC_EXEC"."FDC_MV_REPORT_430"''); end;', >> t3.txt
echo repeat_interval =^> 'FREQ=MONTHLY; BYMONTHDAY=-2', >> t3.txt
echo enabled =^> TRUE >> t3.txt
echo ); >> t3.txt
echo END; >> t3.txt
Во втором случае - вообще ничего не надо экранировать.
25.06.2014 18:28
OlegON
 
Я привык, что кавычки тоже надо экранировать... Можно привести еще массу других вариантов, где экранирование сделать будет трудно. :( Понял, ну, что же, отрицательный опыт - тоже опыт...
25.06.2014 22:12
bayan
 
а DOSKEY не пробовал?
25.06.2014 22:20
OlegON
 
Я уж и забыл, что это такое :) Но и, вспомнив, не могу понять, чем оно тут поможет...
26.06.2014 00:20
bayan
 
Была идея объявить макрос и использовать его в echo. Сейчас добрался до компа, попробовал, оказалось бредом.
Опции темы


Часовой пояс GMT +3, время: 11:20.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.