2009-07-28 8 views
7

zastanawiałem się, jak chcesz wykonać następujące czynności w systemie Windows:Odpowiednik Unix eval w Windows

Ze skryptu powłoki ac (rozszerzenie csh), biegnę skrypt Pythona w ramach „eval” metody, tak aby dane wyjściowe ze skryptu wpływają na środowisko powłoki. Wygląda następująco:

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

Czy zastanawiasz się, jak to zrobić coś jak eval rachunku w systemie Windows w systemie Windows' zbudowany w CMD powłoki. Chcę uruchomić skrypt Python w skrypcie Windows i uruchomić skrypt, który wypisze skrypt Pythona.

** aktualizacja: określone zainteresowanie uruchomieniem z powłoki CMD.

+0

Proszę dokładnie określić, z której powłoki korzystasz. CMD to moje najlepsze przypuszczenie, ale może masz na myśli PowerShell lub port Windows CSH. –

Odpowiedz

4

Jeśli to w cmd.exe, używając pliku tymczasowego jest jedyną opcją [że znam]:

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

(Making pewne domysły, gdzie dane są brakujące z pytaniem)

cmd, kiedy skrypt wsadowy modyfikuje środowisko, domyślnym zachowaniem jest modyfikowanie środowiska procesu CMD, który je wykonuje.

Teraz, jeśli masz skrypt wsadowy, który wywołuje inny skrypt wsadowy, istnieją 3 sposoby, aby to zrobić.

  1. uruchomić plik wsadowy bezpośrednio:

     
    REM call q.bat 
    q.bat 
    REM this line never runs 
    
    Zwykle nie chcesz tego, ponieważ nie wróci do skryptu wywołującego wsadowym. To jest bardziej podobne do goto niż gosub. Proces CMD przełącza się z jednego skryptu do drugiego.

  2. wykonać z call:

     
    REM call q.bat 
    CALL q.bat 
    REM changes that q.bat affects will appear here. 
    
    To jest najczęstszym sposobem dla jednego pliku wsadowego wywołać inny. Gdy zakończy się q.bat, sterowanie powróci do dzwoniącego. Ponieważ jest to ten sam proces CMD, zmiany w środowisku nadal będą występować.
    Uwaga: Jeśli q.bat używa instrukcji EXIT, może to spowodować zakończenie procesu CMD, bez zwracania kontroli do skryptu wywołującego.


    Uwaga 2: Jeśli q.bat używa EXIT /B, proces CMD nie zostanie zakończony. Jest to przydatne do ustawienia ERRORLEVEL.

  3. Execute w nowym procesie CMD.

     
    REM call q.bat 
    CMD /C q.bat 
    REM environment changes in q.bat don't affect me 
    
    Ponieważ bieg q.bat ins nowego procesu CMD, to wpływa na środowisko tego procesu, a nie CMD, że rozmówca jest uruchomiony w

    Uwaga : Jeśli q.bat użyje EXIT, to nie zakończy procesu wywołującego.


Komenda SETLOCAL CMD stworzy nowe środowisko dla bieżącego skryptu. Zmiany w tym środowisku nie będą miały wpływu na rozmówcę. Ogólnie rzecz biorąc, SETLOCAL jest dobrą praktyką, aby uniknąć nieszczelnych zmian środowiska przez przypadek.

Aby korzystać SETLOCAL i nadal naciskać zmian środowiskowych do skryptu wywołującego, przerwij skrypt:

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

to będzie naciskać wartości X i Y dla środowiska macierzystego.


Jeśli natomiast chcesz uruchomić inny proces (nie skrypcie cmd) i ma to wpływ środowiska bieżącego skryptu, niż mieć narzędzie generuje plik wsadowy, który sprawia, że ​​żądane zmiany, a następnie wykonać ten plik wsadowy.

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