2009-07-28 36 views
7

Đã tự hỏi làm thế nào bạn muốn thực hiện những điều sau trong Windows:Tương đương với Unix eval trong Windows

Từ script shell shell (extension csh), tôi đang chạy một tập lệnh Python trong phương thức 'eval' để đầu ra từ tập lệnh ảnh hưởng đến môi trường trình bao. Có vẻ như sau:

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

Đã tự hỏi làm thế nào tôi sẽ làm điều gì đó giống như câu lệnh eval trong Windows bằng cách sử dụng vỏ CMD tích hợp trong Windows. Tôi muốn chạy một kịch bản Python trong một kịch bản Windows và có kịch bản chạy những gì các kịch bản Python in ra.

** cập nhật: sở thích được chỉ định khi chạy từ trình bao CMD.

+0

Vui lòng nêu cụ thể về vỏ bạn đang sử dụng. CMD là dự đoán tốt nhất của tôi, nhưng có thể bạn có nghĩa là PowerShell hoặc một cổng CSH của Windows. –

Trả lời

4

Nếu đó là trong cmd.exe, sử dụng một tập tin tạm thời là lựa chọn duy nhất [mà tôi biết]:

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

(Làm một số dự đoán nơi các chi tiết bị thiếu từ câu hỏi của bạn)

Trong CMD, khi một kịch bản lệnh thay đổi môi trường, hành vi mặc định là nó thay đổi môi trường của tiến trình CMD đang thực thi nó.

Bây giờ, nếu bạn có tập lệnh theo lô gọi một tập lệnh lô khác, có 3 cách để thực hiện.

  1. chạy file batch trực tiếp:

     
    REM call q.bat 
    q.bat 
    REM this line never runs 
    
    Thông thường, bạn không muốn điều này, bởi vì nó sẽ không quay trở lại kịch bản gọi điện thoại hàng loạt. Số này giống như goto hơn gosub. Quá trình CMD chỉ chuyển từ kịch bản này sang tập lệnh khác.

  2. thực hiện với call:

     
    REM call q.bat 
    CALL q.bat 
    REM changes that q.bat affects will appear here. 
    
    Đây là cách phổ biến nhất cho một tệp theo lô để gọi một tệp khác. Khi q.bat thoát, kiểm soát sẽ trở lại người gọi. Vì đây là cùng một quy trình CMD, các thay đổi đối với môi trường sẽ vẫn ở đó.

    Lưu ý: Nếu q.bat sử dụng câu lệnh EXIT, điều này có thể khiến quá trình CMD chấm dứt mà không cần kiểm soát lại tập lệnh gọi.


    Lưu ý 2: Nếu q.bat sử dụng EXIT /B, thì quy trình CMD sẽ không thoát. Điều này hữu ích cho việc thiết lập ERRORLEVEL.

  3. Execute trong một quá trình CMD mới:.

     
    REM call q.bat 
    CMD /C q.bat 
    REM environment changes in q.bat don't affect me 
    
    Kể từ q.bat chạy ins một quá trình CMD mới, nó ảnh hưởng đến môi trường của quá trình đó, và không phải là CMD rằng người gọi đang chạy trong

    Note : Nếu q.bat sử dụng EXIT, nó sẽ không chấm dứt quá trình của người gọi.


Các SETLOCAL CMD lệnh sẽ tạo ra một môi trường mới cho kịch bản hiện hành. Các thay đổi trong môi trường đó sẽ không ảnh hưởng đến người gọi. Nói chung, SETLOCAL là một thực hành tốt, để tránh bị rò rỉ thay đổi môi trường do tai nạn.

Để sử dụng SETLOCAL và vẫn đẩy những thay đổi môi trường để kịch bản gọi điện thoại, kết thúc kịch bản với:

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

này sẽ đẩy các giá trị của X và Y đối với môi trường của phụ huynh.


Nếu mặt khác bạn muốn chạy một quá trình (không phải là một kịch bản CMD) và có nó ảnh hưởng đến môi trường kịch bản hiện tại, hơn có công cụ tạo ra một tập tin thực thi mà làm cho những thay đổi mà bạn muốn, sau đó thực hiện tập tin thực thi đó.

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

Các vấn đề liên quan