2009-04-20 3 views
1

Я запускаю исполняемый файл в пакетном файле с двумя параметрами;Установка переменной из исполняемого файла

cmd /k ""executable" "param1" "param2""

Это возвращает строку, я хочу, чтобы запустить. Я не могу понять, как установить этот возврат в переменной и впоследствии запустить его в IE.

Любые идеи?

+0

Обратите внимание, что вам нужно использовать/C (а не/K), потому что вы хотите, чтобы оболочка завершила и вернула строку. –

ответ

1

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

FOR /F "tokens=*" %%i in ('%~dp0YOUR_APP.exe') do SET TOOLOUTPUT=%%i 

Source

, то вы можете передать значение на IE вроде так:

START "YOUR_WINDOW_NAME" /MAX /D"C:\Program Files\Internet Explorer\" iexplore %TOOLOUTPUT% 

I что код приложения, который определяет URL-адрес, слишком сложный для непосредственного воспроизведения в пакетном файле, или исходный код для исполняемого файла был потерян. Если бы не я лично предпочел бы, чтобы логика была видна в самом файле пакета.

+0

Спасибо Джошуа, это сработало отлично. Код приложения был слишком сложным для воспроизведения в пакетном файле – kgbland

0

Edit: Ромуло А. Ceccon отправил a much better solution, который не требует никакого доступа к файловой системе и пакости. Оставьте это здесь для справки (он также работает с command.com, если вам нужна 9-кратная совместимость), но, пожалуйста, предпочитайте решение Ромуло.


Пройдите через переменную среды, заданную с помощью промежуточного вспомогательного скрипта, который вы динамически генерируете из шаблона. Вам нужны права на запись где-то, в противном случае она не может быть сделано (язык команд оболочки Windows, очень, очень ограничено.)

Давайте назовем ваш шаблон сценария помощник helper.tpl со следующим содержанием:

set INTERMEDVAR= 

Убедитесь в том, что helper.tpl имеет только одну строку (без обратной ссылки CRLF!) и убедитесь, что у вас нет пробелов после знака равенства.

Теперь в главном скрипте, перехватывать вывод из вашей команды во временный файл (назовем его my_output_file.tmp):

cmd /k ""executable" "param1" "param2"" > my_output_file.tmp 

Затем скопируйте содержимое шаблона хелперов и выход вместе в ваш помощник сценарий, давайте назовем его my_helper_script.cmd:

copy /b helper.tpl + my_output_file.tmp my_helper_script.cmd 

Затем оценить вспомогательный скрипт в текущем контексте:

call my_helper_script.cmd 

Теперь INTERMEDVAR переменная устанавливается в первой строке вывода из «исполняемой» (если он выдает более одной строки, вы по своему усмотрению ...) Теперь вы можете вызвать IE:

start iexplore.exe "%INTERMEDVAR%" 

и не забывайте убирать созданные файлы:

del /q /f my_output_file.tmp my_helper_script.cmd 

Это, очевидно, не работает, когда вызывается несколько раз параллельно - вам придется параметризовать временные имена файлов и вспомогательный скрипт с использованием текущего ЦМД .exe PID (например), чтобы они не перезаписывали вывод друг друга, но принцип тот же.

Однако, если вы можете получить настоящую оболочку, используйте ее. cmd.exe чрезвычайно громоздкий.

5

Если возвращаемая строка содержит одну строку, вы можете использовать FOR /F, чтобы установить значение переменной окружения.Например:

s1.cmd

echo this is a one line string 

s2.cmd

@SETLOCAL 
@ECHO OFF 
for /f "tokens=*" %%a in ('cmd /c s1.cmd') do set MY_VAR=%%a 
echo got: %MY_VAR% 
ENDLOCAL 

Результат

C:\> s2.cmd 
got: this is a one line string 

C:\> 
+0

Ох, хорошо. Многое, намного лучше, чем мое решение (которое осталось от дней command.com, говорит: D). Это подтвердилось. –

Смежные вопросы