2009-07-28 3 views
7

Было интересно, как вы могли бы сделать следующее в Windows:Эквивалент Unix Eval в ОС Windows

От сценария оболочки переменного тока (расширение CSH), я бегу сценарий Python в методе «Eval», так что вывод скрипта влияет на среду оболочки. Похоже, это:

eval `python -c "import sys; run_my_code_here(); "` 

Было интересно, как я хотел бы сделать что-то вроде Eval заявления в Windows, используя для Windows' построен в CMD оболочки. Я хочу запустить сценарий Python в сценарии Windows и запустить скрипт, который выдает сценарий Python.

** обновление: указанный интерес к запуску из оболочки CMD.

+0

Пожалуйста, укажите, какую оболочку вы используете. CMD - это мое лучшее предположение, но, возможно, вы имеете в виду PowerShell или порт Windows CSH. –

ответ

4

Если это в cmd.exe, используя временный файл является единственным вариантом [что я знаю]:

python -c "print(\"Hi\")" > temp.cmd 
call temp.cmd 
del temp.cmd 
3

(Изготовление некоторые предположения, где детали отсутствуют на вопрос)

В ЦМД, когда пакетный скрипт изменяет среду, поведение по умолчанию заключается в том, что оно изменяет среду процесса CMD, выполняющего его.

Теперь, если у вас есть пакетный скрипт, который вызывает другой пакетный скрипт, есть 3 способа сделать это.

  1. выполнить пакетный файл напрямую:

     
    REM call q.bat 
    q.bat 
    REM this line never runs 
    
    Обычно вы не хотите этого, потому что он не вернется в вызывающем пакетного сценария. Это больше похоже на goto, чем gosub. Процесс CMD просто переключается с одного сценария на другой.

  2. выполнить с call:

     
    REM call q.bat 
    CALL q.bat 
    REM changes that q.bat affects will appear here. 
    
    Это наиболее распространенный способ для одного пакетного файла вызвать другой. Когда q.bat выйдет, управление вернется к вызывающему абоненту. Поскольку это тот же CMD-процесс, изменения в среде все равно будут.

    Примечание: Если q.bat использует оператор EXIT, это может привести к завершению процесса CMD, не возвращая управление вызывающему скрипту.

    Примечание 2: Если q.bat использует EXIT /B, то процесс CMD не будет завершен. Это полезно для установки ERRORLEVEL.

  3. Выполнить в новом процессе CMD:.

     
    REM call q.bat 
    CMD /C q.bat 
    REM environment changes in q.bat don't affect me 
    
    Поскольку q.bat запуск INS нового процесса CMD, это влияет на окружающую среду этого процесса, а не CMD, что абонент работает в

    Примечания : Если q.bat использует EXIT, он не завершит процесс вызова.


SETLOCAL команда CMD создаст новую среду для текущего сценария. Изменения в этой среде не повлияют на вызывающего абонента. В целом, SETLOCAL является хорошей практикой, чтобы избежать случайных изменений окружающей среды.

Чтобы использовать SETLOCAL и еще толкать изменения окружающей среды в сценарий вызова, завершение сценария с:

 
    ENDLOCAL && SET X=%X% && SET Y=%Y% 

это будет толкать значения X и Y в родительской среде.


Если с другой стороны, вы хотите, чтобы запустить другой процесс (не сценарий CMD) и он влияет на окружающую среду текущего сценария, чем у инструмента генерировать пакетный файл, который делает необходимые изменения, а затем выполнить этот пакетный файл.

 
    REM q.exe will write %TEMP%\runme.cmd, which looks like: 
    REM  set X=Y 
    q.exe 
    call "%TEMP%\runme.cmd" 

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