109: (Default)
[personal profile] 109
что-то не могу сообразить. есть relative path, типа "..\..\my\special\folder\containing\generic\scripts", который в начале выполнения cmd скрипта надо добавить в path, чтобы оттуда можно было вызывать по-быстрому. но добавлять, естественно, надо absolute path, а не relative. как одно в другое превратить внутри командника?

и, уж раз зашла такая пьянка - как из программы, запущенной из комадника, передать что-нибудь обратно в этот командник? передать что-нибудь более осмысленное, чем errorlevel. под программой можно понимать что угодно - бинарник, powershell script, другой cmd script.

(no subject)

Date: 2007-10-11 04:57 am (UTC)
From: [identity profile] piggymouse.livejournal.com
Мы про cmd-шные батники говорим?

По первому пункту, если текущий каталог всё равно сменится, можно сделать что-то вроде:
cd "..\..\my\special\folder\containing\generic\scripts"
set PATH=%PATH%;%CD%

По второму пункту — через файлик.

(no subject)

Date: 2007-10-11 04:58 am (UTC)
From: [identity profile] piggymouse.livejournal.com
О, кстати новый cmd поддерживает pushd и popd.

(no subject)

Date: 2007-10-11 05:02 am (UTC)
From: [identity profile] 109.livejournal.com
о, сцуко, ты гений. мысль перейти туда меня не осенила. даже если каталог менять не надо, можно pushd/popd заюзать, чтобы вернуться.

а что потом с файлом делать? как его содержимое превратить в переменные cmd, которыми можно оперировать?

(no subject)

Date: 2007-10-11 06:50 am (UTC)
From: [identity profile] ban-dana.livejournal.com
Туда даже переходить не обязательно. Просто PATH=%PATH%;your_path и радуйся жизни. А передать можно через те же переменные окружения, если делать типа так:

======= sample begin =======

script1.bat:
-----------
echo in script 1
call script2.bat
echo %SCRIPT2_RESULT%

script2.bat:
-----------
echo in script2
set SCRIPT2_RESULT="result of script2"

======= sample end =======

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

(no subject)

Date: 2007-10-11 09:17 am (UTC)
From: [identity profile] 109.livejournal.com
другой cmd script - да, оказалось что можно (я думал, что нельзя, поэтому записал его в тот же список). но я вызываю powershell script из cmd, и тут это уже не работает.

(no subject)

Date: 2007-10-11 09:21 am (UTC)
From: [identity profile] 109.livejournal.com
ах да, и первый совет тоже неправильный, спасибо. я же сказал, что у меня относительный путь, его нельзя просто добавить в path.

(no subject)

Date: 2007-10-11 06:39 am (UTC)
From: [identity profile] metaclass.livejournal.com
Выводить в файлик типа setvar.bat что-то вроде set tempvar=somevalue, а зачем этому файлику делать call setvar.bat

(no subject)

Date: 2007-10-11 09:01 am (UTC)
From: [identity profile] 109.livejournal.com
хм, и действительно. а почему тогда переменные окружения не сохраняются, когда я из cmd вызываю powershell script?

(no subject)

Date: 2007-10-12 08:26 am (UTC)
From: [personal profile] alll
Потому что он вызывается через создание отдельного процесса. А переменные окружения у каждого процесса во время его работы свои, друг на друга не влияют.

(no subject)

Date: 2007-10-11 07:41 am (UTC)
From: [personal profile] alll
По второму пункту курить описание шелловской команды FOR по части /F - там есть практически перловые бэктики:
> help FOR
...
Finally, you can use the FOR /F command to parse the output of a
command. You do this by making the filenameset between the
parenthesis a back quoted string. It will be treated as a command
line, which is passed to a child CMD.EXE and the output is captured
into memory and parsed as if it was a file. So the following
example:

FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

would enumerate the environment variable names in the current
environment.
...

(no subject)

Date: 2007-10-11 09:08 am (UTC)
From: [identity profile] 109.livejournal.com
это было бы круто, но не работает, утверждая "i was unexpected at this time."

а попроще пример не можешь привести? скажем, мне не надо парсить, а просто запихнуть в environment variable.

(no subject)

Date: 2007-10-11 03:31 pm (UTC)
From: [personal profile] alll
В env variables родительского процесса запихнуть невозможно, насколько я помню.

Насчёт не работает - может покажешь код?

(no subject)

Date: 2007-10-11 06:12 pm (UTC)
From: [identity profile] 109.livejournal.com
так твой не работал :)
как стало ясно из второго сниппета, нужен двойной процент.

мапед не мой

Date: 2007-10-12 08:22 am (UTC)
From: [personal profile] alll
какой-такой мой? я прямо из "help for" цитировал. :)
А насчёт %% - это очень древний прикол. :)

(no subject)

Date: 2007-10-11 03:47 pm (UTC)
From: [personal profile] alll
Короче, вот такой код в test.cmd
-----cut here-----------
@echo off
FOR /F "usebackq" %%I IN (`echo testtest`) DO set mytest=%%I

echo %mytest%
-----cut here-----------
выдаёт в stdout
testtest

Вместо `echo testtest` можно подставить любой исполняемый файл, выдающий в stdout нужное значение. Там в-принципе ещё можно и split полученной строчки сделать по произвольному разделителю, но это, как я понимаю, уже лишнее. :)

(no subject)

Date: 2007-10-11 06:10 pm (UTC)
From: [identity profile] 109.livejournal.com
ура, заработало! а напрямую stdout принять в env-variable нет способов?

(no subject)

Date: 2007-10-12 08:29 am (UTC)
From: [personal profile] alll
В микрософтофском шелле - нет, насколько я мне известно.
В юниксовых есть тот самый бэктик (``), кастрированый вариант которого засветился в микрософтовском FOR.

(no subject)

Date: 2007-10-11 07:53 am (UTC)
From: [personal profile] alll
а вообще можно юзать писать скрипты на жабаскрипте (и пускать их через csript), тогда будет доступ к достаточно мощному api.

(no subject)

Date: 2007-10-11 09:13 am (UTC)
From: [identity profile] 109.livejournal.com
спокуха! сами скрипты пишутся на powershell, и там никаких проблем. но сначала, чтобы запустить powershell из cmd, надо некоторую обвязку сделать, и вот тут-то наступает жопа. мне, грубо говоря, надо передать path из powershell назад d cmd, чтобы там выставить правильный path, чтобы все последующие запуски powershell уже работали как надо.

(no subject)

Date: 2007-10-11 08:17 am (UTC)
From: [identity profile] ati.livejournal.com
"смотри сынок, как люди без /bin/sh мучаются"

Серьезно -- есть же порт sh под форточки, проще всего писать такие вещи на нем.
присвоить переменной myvar STDOUT myprog:
myvar = `myprog params`

и т.п.

(no subject)

Date: 2007-10-11 09:24 am (UTC)
From: [identity profile] 109.livejournal.com
мля. в powershell всё; это ещё лучше, чем sh. но запускать-то его всё равно из cmd надо.

(no subject)

Date: 2007-10-11 09:08 am (UTC)
From: [identity profile] faceted-jacinth.livejournal.com
Если юзаешь повершелл, так юзай его с начала до конца и нормально, может быть? Компилируешь прожраммку в .нет дллочгу, вызываешь оттуда методы, получаешь полноценные объекты как return values, делаешь с ними что угодно.

(no subject)

Date: 2007-10-11 09:32 am (UTC)
From: [identity profile] 109.livejournal.com
компилировать даже и не надо, там же можно прямо в скрипте практически сишарпный код струячить. но, чтобы запустить скрипт, надо сначала сделать powershell "set-executionPolicy RemoteSigned" из командника - маразм, да? и тогда получается, что если по уму делать, то надо запомнить текущую полиси, выставить нужную, сделать что хотел, вернуть полиси. ну и задался вопросом, а как же строчки возвращать из powershell в cmd. вот тут мне говорят, что for умеет понимать, но что-то не получается.

(no subject)

Date: 2007-10-13 04:06 am (UTC)
From: [identity profile] anton-solovyev.livejournal.com
Напишите в MS, чтобы дали наконец нормальный шелл :)

Profile

109: (Default)
109

March 2019

S M T W T F S
     12
3456789
101112131415 16
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags